Wie kann ich SMTP in C # authentifizieren lassen?

74

Ich erstelle eine neue ASP.NET-Webanwendung, die SMTP zum Senden von Nachrichten verwendet. Das Problem ist, dass das SMTP nicht authentifiziert wurde, von wem die Nachricht gesendet wurde.

Wie kann ich SMTP in meinem Programm authentifizieren lassen? Hat C # eine Klasse mit Attribut zur Eingabe von Benutzername und Passwort?

ecleel
quelle

Antworten:

154
using System.Net;
using System.Net.Mail;

using(SmtpClient smtpClient = new SmtpClient())
{
    var basicCredential = new NetworkCredential("username", "password"); 
    using(MailMessage message = new MailMessage())
    {
        MailAddress fromAddress = new MailAddress("[email protected]"); 

        smtpClient.Host = "mail.mydomain.com";
        smtpClient.UseDefaultCredentials = false;
        smtpClient.Credentials = basicCredential;

        message.From = fromAddress;
        message.Subject = "your subject";
        // Set IsBodyHtml to true means you can send HTML email.
        message.IsBodyHtml = true;
        message.Body = "<h1>your message body</h1>";
        message.To.Add("[email protected]"); 

        try
        {
            smtpClient.Send(message);
        }
        catch(Exception ex)
        {
            //Error, could not send the message
            Response.Write(ex.Message);
        }
    }
}

Sie können den obigen Code verwenden.

Arief
quelle
2
Woher kommen der Benutzername und das Passwort? und was ist mail.mydomain.com? Ist das der DNS-Name?
Shyju
5
Sie sind Ihre E-Mail-Adresse und Ihr Passwort. mail.mydomain.com ist Ihr SMTP-Server (z. B. smtp.gmail.com).
Arief
2
Sie sollten das MailMessage-Objekt in eine using-Anweisung einschließen (oder Dispose darauf aufrufen, nachdem Sie fertig sind), oder?
Ben
Normalerweise müssen Sie auch einen Port konfigurieren. Dies kann durch Verwendung der Port-Eigenschaft wiesmtpClient.Port(123)
Wouter Vanherck
@Arief: Hallo kannst du meine Frage überprüfen? stackoverflow.com/questions/56604850/… irgendwelche Vorschläge, wie unsere E-Mail-Funktion funktionieren soll, nicht als externe Absender?
Amir
89

Stellen Sie sicher, dass Sie SmtpClient.Credentials nach dem Anruf einstellen SmtpClient.UseDefaultCredentials = false.

Die Reihenfolge ist wichtig , da Einstellung SmtpClient.UseDefaultCredentials = falsezurückgesetzt SmtpClient.Credentialsauf null.

Joe King
quelle
Wenn Sie Sendgrid verwenden und die Reihenfolge falsch ist, wird der Fehler "Mailbox nicht verfügbar. Die Serverantwort lautete: Nicht authentifizierte Absender nicht zulässig" zurückgegeben. Das Festlegen von Anmeldeinformationen nach dem Flag UseDefaultCredentials behebt dieses Problem
Marcinu
2

Um eine Nachricht über TLS / SSL zu senden, müssen Sie Ssl der SmtpClient-Klasse auf true setzen.

string to = "[email protected]";
string from = "[email protected]";
MailMessage message = new MailMessage(from, to);
message.Subject = "Using the new SMTP client.";
message.Body = @"Using this new feature, you can send an e-mail message from an application very easily.";
SmtpClient client = new SmtpClient(server);
// Credentials are necessary if the server requires the client 
// to authenticate before it will send e-mail on the client's behalf.
client.UseDefaultCredentials = true;
client.EnableSsl = true;
client.Send(message);
Jason Dang
quelle
Schreiben Sie ein Codebeispiel über SSL vs SMTP Client, um eine bessere Antwort zu erhalten
Nikola Lukic
1

Wie senden Sie die Nachricht?

Die Klassen im System.Net.MailNamespace (die Sie wahrscheinlich verwenden sollten) unterstützen die Authentifizierung vollständig, entweder in Web.config angegeben oder mithilfe der SmtpClient.CredentialsEigenschaft.

Tor Haugen
quelle
0

In meinem Fall auch nach Befolgung aller oben genannten Punkte. Ich musste mein Projekt von .net 3.5 auf .net 4 aktualisieren, um eine Autorisierung für unseren internen Exchange 2010-Mailserver durchzuführen.

YoniXw
quelle