Site logo
Site logo
Programmieren aus Leidenschaft
Programmieren aus Leidenschaft

E-Mail Versand mit SMTP


tut_smtp

Ein weiteres Feature in der 2.0-Version des Frameworks ist der vereinfachte Versand von E-Mails aus eigenen Programmen. War dies in der Vergangenheit ein sehr komplexes Unterfangen geht es jetzt sehr einfach und strukturiert. Als erstes braucht man wie immer den richtigen Namespace:

using System.Net.Mail;

Wie bei der Briefpost sind die wichtigesten Daten auch hier der Absender und der Empfänger.

MailAddress eMailSender = new MailAddress("ich@mail.com");
MailAddress eMailEmpfaenger = new MailAddress("du@mail.com");


MailAddress ist hier ein sehr interessanter Datentyp. Versucht man nämlich ihn mit etwas anderem als einer gültigen E-Mail-Adresse zu beschreiben, bekommt man eine FormatException. Komplizierte Kontrollmethoden, die eine E-Mail-Adresse prüfen, entfallen also. Ebenfalls sollte eine solche Adresse nicht leer sein. Eine ArgumentException wäre die Folge. Sender- und Empfängerangabe sind zwar noch keine komplette E-Mail aber ein wichtiger Bestandteil. Die eigendliche E-Mail wird dann als MailMessage erzeugt.

MailMessage myMailMessage = new MailMessage(eMailSender, eMailEmpfaenger);

Was jetzt noch fehlt ist der eigendliche Text (Body) und das Betreff (Subject) der E-Mail. Beide Felder sind Member von MailMessage.

myMailMessage.Subject = "Hallo du";
myMailMessage.Body = "Besuch mich mal wieder";


Damit ist eine einfache E-Mail fertig. Jetzt muß man sie nur noch versenden. Da wir unsere E-Mail über das SMTP Protokoll versenden wollen, ist ein SmtpClient der nächte logische Schritt. Hostname oder die IP-Adresse werden als Parameter mitgegeben.

SmtpClient mySMTPClient = new SmtpClient("Servername oder IP Adresse");

Eigendlich sollte das schon alles sein. Leider ist SMTP ein Protokoll ohne Authentifizierung. Und die meisten Mailserver mögen es gar nicht wenn unbekannte Benutzer über sie senden. In der Praxis verwendet man hier das Prinzip "POP3 before SMTP". Ein Gegensatz zu SMTP ist POP3 das Protokoll, dass zum Empfangen von E-Mails verwendet wird - ein Protokoll mit Authentifizierung. Von E-Mail-Programmen kennt man das Problem, dass man oftmals nur Nachrichten versenden kann, nachdem man welche abgerufen hat. POP3 sendet also Benutzername und Passwort zum Mailserver, folglich muß auch der SmtpClient irgendwie diese Daten übertragen. Auch das ist relativ einfach. Eine seperate POP3-Verbindung muß nicht erstellt werden.

mySMTPClient.Credentials = new System.Net.NetworkCredential("Postfach Username", "Postfach Passwort");

Jetzt kann die Nachricht endlich versendet werden:

mySMTPClient.Send(myMailMessage);

Es gibt eine weitere Möglichkeit des Versandes. Denn die Send-Methode blockiert den weiteren Progammablauf bis die E-Mail wirklich zum Server gesendet wurde. Dies kann unter Umständen einige Zeit in Anspruch nehmen.

mySMTPClient.SendAsync(myMailMessage, userState);

SendAsync ist hier die bessere Alternative. Nachdem der Auftrag zum Versenden gegeben wurde, läuft das Programm regulär weiter. Jetzt hat man nur noch das Problem, dass man gar nicht weiss, wann die eMail komplett versendet wurde oder ob es zu einem Fehler kam. Dafür gibt es hier ein Ereigniss (Event) das man abonnieren kann.

mySMTPClient.SendCompleted += new SendCompletedEventHandler(VersandBeendet);

Die Methode VersandBeendet wird aufgerufen wenn der Versand abgeschlossen ist. Wann das passiert, kann nicht genau bestimmt werden. Ob der Versand nun erfolgreich oder mit Fehlern beendet wurde sollte man selbst prüfen. (Siehe Beispielprogramm).
Bleibt noch die bisher unbekannte Variable „userState“. In „userState“ kann man nachrichten-spezifische Daten übergeben, zum Beispiel eine eindeutige ID. Da der Mailversand asynchron läuft gibt es auch keine Gewissheit darüber, in welcher Reihenfolge die E-Mails versendet werden. Da „userState“ mit in die Methode „VersandBeendet“ übertragen wird, kann man sie dort wieder auslesen (Siehe Beispielprogramm).