Wie lege ich einen Benutzernamen und ein Passwort für das SmtpClient-Objekt in .NET fest?

160

Ich sehe verschiedene Versionen des Konstruktors, eine verwendet Informationen aus web.config, eine gibt den Host an und eine den Host und den Port. Aber wie setze ich den Benutzernamen und das Passwort auf etwas anderes als die web.config? Wir haben das Problem, dass unser internes SMTP von einigen Hochsicherheitsclients blockiert wird und wir ihren SMTP-Server verwenden möchten. Gibt es eine Möglichkeit, dies über den Code anstelle von web.config zu tun?

Wie würde ich in diesem Fall die Anmeldeinformationen von web.config verwenden, wenn beispielsweise keine aus der Datenbank verfügbar sind?

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
quelle

Antworten:

301

Der SmtpClient kann von Code verwendet werden:

SmtpClient mailer = new SmtpClient();
mailer.Host = "mail.youroutgoingsmtpserver.com";
mailer.Credentials = new System.Net.NetworkCredential("yourusername", "yourpassword");
Pipelinecache
quelle
Wenn ich keine einstelle, werden standardmäßig die aus web.config verwendet?
CloudMeta
3
@pipelinecache Ryan hat recht, wenn keine Anmeldeinformationen angegeben sind, wird <system.net> <mailSettings> in web.config
Tomas
1
Ich glaube, wenn UseDefaultCredentialses auf true gesetzt ist, werden die Standardeinstellungen verwendet, andernfalls wird zuerst in der CredentialsEigenschaft und dann in der web.config gesucht. Wenn keine festgelegt sind, wird die E-Mail anonym gesendet.
TheGateKeeper
1
Ist es sicher, Benutzername und Passwort im C # -Code fest zu codieren?
Kudlatiger
3
Warnung: Wenn Sie 'UseDefaultCredentials = false' festlegen, müssen Sie dies tun, bevor Sie Anmeldeinformationen festlegen, da durch die Änderung alle vorhandenen Anmeldeinformationen auf Null gesetzt werden.
WhoIsRich
26

Verwenden NetworkCredential

Ja, fügen Sie einfach diese beiden Zeilen zu Ihrem Code hinzu.

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

client.Credentials = credentials;
Gabe
quelle
4
warum nicht nur eine Zeile?
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
quelle
4
Sie sollten versuchen, nur relavent Code auf die Antwort zu posten
Johnny 5
1
@ Johnny5 Kontext ist nicht das größte Verbrechen der Welt
Shiv
@shiv du bist richtig, aber ein Kontext würde eine Erklärung der Antwort schreiben, die auch nicht hier ist.
Johnny 5
1
@ johnny5 Die anderen Top-Antworten haben keine Erklärungen - das Beispiel ist ziemlich selbsterklärend, da der Code selbstdokumentierend ist.
Shiv
@Shiv Die Top-Antworten sind selbstdokumentierend, da sie nur den relevanten Code veröffentlichen. Mein ursprünglicher Kommentar hat genauso viele positive Stimmen wie diese Antwort. Aus einem Grund verstehe ich nicht, warum ich 15 Codezeilen durchsehen müsste, wenn nur 2 zur Beantwortung dieser Frage benötigt werden, wenn Sie diese Antwort nützlich fanden. stimme zu. Ansonsten macht es keinen Sinn, über einen Kommentar zu streiten, den ich vor 2 Jahren gemacht habe und den andere nützlich fanden
Johnny 5
-2

Da nicht alle meiner Clients authentifizierte SMTP-Konten verwenden, habe ich nur dann auf das SMTP-Konto zurückgegriffen, wenn die App-Schlüsselwerte in der Datei web.config angegeben sind.

Hier ist der VB-Code:

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
quelle