Come impostare username e password per l'oggetto SmtpClient in .NET?


161

Vedo diverse versioni del costruttore, una utilizza le informazioni da web.config, una specifica l'host e una l'host e la porta. Ma come posso impostare nome utente e password su qualcosa di diverso da web.config? Abbiamo il problema in cui il nostro smtp interno è bloccato da alcuni client ad alta sicurezza e vogliamo usare il loro server smtp, c'è un modo per farlo dal codice anziché da web.config?

In questo caso, come utilizzerei le credenziali web.config se nessuna è disponibile dal database, ad esempio?

public static void CreateTestMessage1(string server, int port)
{
    string to = "jane@contoso.com";
    string from = "ben@contoso.com";
    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());
    }              
}

Risposte:


302

SmtpClient può essere utilizzato dal codice:

SmtpClient mailer = new SmtpClient();
mailer.Host = "mail.youroutgoingsmtpserver.com";
mailer.Credentials = new System.Net.NetworkCredential("yourusername", "yourpassword");

se non ne imposto uno, userà quelli di web.config per impostazione predefinita?
CloudMeta,

3
@pipelinecache Ryan ha ragione, se non ci sono le credenziali fornite guarderà <system.net> <mailSettings> in web.config
Tomas

1
Credo che se UseDefaultCredentialsimpostato su true utilizzerà le impostazioni predefinite, altrimenti cercherà prima in Credentialsproprietà e poi in web.config. Se nessuno è impostato, invierà l'e-mail in modo anonimo.
TheGateKeeper il

1
È sicuro codificare nome utente e password nel codice c #?
kudlatiger,

3
Avvertenza: se si imposta "UseDefaultCredentials = false", è necessario PRIMA di impostare le credenziali, poiché la modifica annulla tutte le credenziali esistenti impostate.
WhoIsRich,

26

Uso NetworkCredential

Sì, aggiungi queste due righe al tuo codice.

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

client.Credentials = credentials;

4
perché non solo una riga?
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);

4
dovresti provare a pubblicare solo il codice relavent alla risposta
johnny 5

1
Il contesto di @ johnny5 non è il crimine più grande del mondo
Shiv,

@shiv hai ragione, ma un contesto sarebbe scrivere una spiegazione della risposta, che inoltre non è qui.
johnny 5

1
@ johnny5 le altre risposte migliori non hanno spiegazioni - l'esempio è abbastanza autoesplicativo in quanto il codice è auto-documentante.
Shiv,

@Shiv le risposte migliori sono auto-documentanti perché pubblicano solo il codice pertinente. Il mio commento originale ha tanti voti quanto questa risposta, per un motivo, non vedo perché dovrei setacciare ben 15 righe di codice, quando solo 2 sono necessari per rispondere a questa domanda, se hai trovato utile questa risposta, votalo. Altrimenti, questi non hanno senso discutere di un commento che ho fatto 2 anni fa, che altri hanno trovato utile
johnny 5

-2

Poiché non tutti i miei clienti utilizzano account SMTP autenticati, ho deciso di utilizzare l'account SMTP solo se i valori della chiave dell'app sono forniti nel file web.config.

Ecco il codice 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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.