¿Cómo configurar el nombre de usuario y la contraseña para el objeto SmtpClient en .NET?

161

Veo diferentes versiones del constructor, uno usa información de web.config, uno especifica el host y otro el host y el puerto. Pero, ¿cómo configuro el nombre de usuario y la contraseña en algo diferente de web.config? Tenemos el problema de que algunos clientes de alta seguridad bloquean nuestro smtp interno y queremos usar su servidor smtp, ¿hay alguna forma de hacerlo desde el código en lugar de web.config?

En este caso, ¿cómo usaría las credenciales web.config si ninguna está disponible en la base de datos, por ejemplo?

public static void CreateTestMessage1(string server, int port)
{
    string to = "[email protected]";
    string from = "[email protected]";
    string subject = "Using the new SMTP client.";
    string body = @"Using this new feature, you can send an e-mail message from an application very easily.";
    MailMessage message = new MailMessage(from, to, subject, body);
    SmtpClient client = new SmtpClient(server, port);
    // Credentials are necessary if the server requires the client 
    // to authenticate before it will send e-mail on the client's behalf.
    client.Credentials = CredentialCache.DefaultNetworkCredentials;

    try {
        client.Send(message);
    }
    catch (Exception ex) {
        Console.WriteLine("Exception caught in CreateTestMessage1(): {0}", 
                    ex.ToString());
    }              
}
CloudMeta
fuente

Respuestas:

302

El SmtpClient puede ser usado por código:

SmtpClient mailer = new SmtpClient();
mailer.Host = "mail.youroutgoingsmtpserver.com";
mailer.Credentials = new System.Net.NetworkCredential("yourusername", "yourpassword");
pipelinecache
fuente
si no configuro uno, ¿usará los de web.config de forma predeterminada?
CloudMeta
3
@pipelinecache Ryan tiene razón, si no se proporcionan credenciales, verá <system.net> <mailSettings> en web.config
Tomás
1
Creo que si UseDefaultCredentialsse establece en verdadero, usará los valores predeterminados; de lo contrario, primero se buscará en la Credentialspropiedad y luego en web.config. Si no hay ninguno configurado, enviará el correo electrónico de forma anónima.
TheGateKeeper
1
¿Es seguro codificar el nombre de usuario y la contraseña en el código C #?
kudlatiger
3
Advertencia: si configura 'UseDefaultCredentials = false', debe hacerlo ANTES de establecer Credenciales, ya que el cambio anula cualquier conjunto de credenciales existente.
WhoIsRich
26

Utilizar NetworkCredential

Sí, solo agrega estas dos líneas a tu código.

var credentials = new System.Net.NetworkCredential("username", "password");

client.Credentials = credentials;
Gabe
fuente
44
¿Por qué no solo una línea?
JSON
7
SmtpClient MyMail = new SmtpClient();
            MailMessage MyMsg = new MailMessage();
            MyMail.Host = "mail.eraygan.com";
            MyMsg.Priority = MailPriority.High;
            MyMsg.To.Add(new MailAddress(Mail));
            MyMsg.Subject = Subject;
            MyMsg.SubjectEncoding = Encoding.UTF8;
            MyMsg.IsBodyHtml = true;
            MyMsg.From = new MailAddress("username", "displayname");
            MyMsg.BodyEncoding = Encoding.UTF8;
            MyMsg.Body = Body;
            MyMail.UseDefaultCredentials = false;
            NetworkCredential MyCredentials = new NetworkCredential("username", "password");
            MyMail.Credentials = MyCredentials;
            MyMail.Send(MyMsg);
M.Alaghemand
fuente
44
deberías intentar publicar solo el código correspondiente a la respuesta
johnny 5
1
@ johnny5 el contexto no es el crimen más grande del mundo
Shiv
@shiv tienes razón, pero un contexto sería escribir una explicación de la respuesta, que tampoco está aquí.
Johnny 5
1
@ johnny5 las otras respuestas principales no tienen explicaciones: el ejemplo se explica por sí mismo, ya que el código se documenta por sí mismo.
Shiv
@Shiv las respuestas principales se documentan automáticamente porque publican solo el código relevante. Mi comentario original tiene tantos votos positivos como esta respuesta, por una razón, no veo por qué tendría que tamizar 15 líneas de código, cuando solo se necesitan 2 para responder a esta pregunta, si encuentra útil esta respuesta, Votarlo. De lo contrario, no tiene sentido discutir sobre un comentario que hice hace 2 años que otro encontró útil
Johnny 5 de
-2

Como no todos mis clientes usan cuentas SMTP autenticadas, recurrí al uso de la cuenta SMTP solo si los valores clave de la aplicación se proporcionan en el archivo web.config.

Aquí está el código VB:

sSMTPUser = ConfigurationManager.AppSettings("SMTPUser")
sSMTPPassword = ConfigurationManager.AppSettings("SMTPPassword")

If sSMTPUser.Trim.Length > 0 AndAlso sSMTPPassword.Trim.Length > 0 Then
    NetClient.Credentials = New System.Net.NetworkCredential(sSMTPUser, sSMTPPassword)

    sUsingCredentialMesg = "(Using Authenticated Account) " 'used for logging purposes
End If

NetClient.Send(Message)
A. Varma
fuente