.Net MailMessage-Objekt als EML-Datei speichern
Inhaltsverzeichnis
Symptom
E-Mail-Nachrichten, die von einem Webserver erzeugt werden, können wegen eines Fehlers (z. B. Netzwerkfehler, Programmfehler, etc.) nicht verschickt werden und gehen sofort verloren. Die Fehlersuche wird dadurch erheblich erschwert.
Ursache und Lösung
Tritt ein Fehler beim Mailversand auf, kann der Fehler zwar mit den üblichen Logging-Mechanismen registriert werden, die Original-E-Mail aber ist verloren. Insbesondere wenn ein Netzwerkfehler vorliegt und die E-Mail daher auch nicht verdeckt (BCC) an Standardempfänger geschickt werden kann, bietet sich die Lösung an, das MailMessage-Objekt für die Fehlersuche als EML-Datei auf dem Server zu speichern. EML-Dateien enthalten den gesamten Inhalt einer E-Mail und deren Kopfdaten, also z. B. auch Informationen über Absender und Empfänger. EML-Dateien können mit E-Mail-Programmen wie MS Outlook oder Mozilla Thunderbird direkt geöffnet werden. Mithilfe der statischen Erweiterungsklasse „MailMessageExtensions“ kann ein MailMessage-Objekt direkt als EML-Datei gespeichert werden.
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net.Mail; using System.Text; namespace MaxIt.TechCorner { public static class MailMessageExtensions { /// <summary> /// Stores a MailMessage as EML file. /// </summary> /// <param name="message">The MailMessage object to be stored.</param> public static void Archive(this MailMessage message) { using (SmtpClient diskclient = new SmtpClient("mysmtphost")) { diskclient.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory; diskclient.PickupDirectoryLocation = "%TEMP%\\mails"; diskclient.Send(message); } } } }
Dazu wird ein neues SmtpClient-Objekt erzeugt, dessen Option „DeliveryMethod“ den Wert „SmtpDe-liveryMethod.SpecifiedPickupDirectory“ erhält.
Dadurch wird beim Versand das MailMessage-Objekt als EML-Datei gespeichert. Der Speicherort wird der Eigenschaft „PickupDirectoryLocation“ zugewiesen.
Verwendet wird die Erweiterung, indem deren Namespace eingebunden und im Code die Archive()-Methode für das MailMessage-Objekt aufgerufen wird:
System.Net.Mail.SmtpClient smtpclient; System.Net.Mail.MailMessage message; // ... try { // Try to send message smtpclient.Send(message); } catch (Exception ex) { // Archive message message.Archive(); }
Zusätzlich zu fehlerbeschreibenden Logging-Nachrichten steht so auch die E-Mail selbst, inklusive eventuell vorhandener Dateianhänge, für die Fehlersuche zur Verfügung.
Weitere Informationen
Mehr Informationen zur Anwender- und Netzwerkbetreuung finden Sie auf
www.max-it.de/managed-services/managed-client-services
Kontakt
Wenn Sie Fragen oder Anmerkungen zu diesem Artikel haben, melden Sie sich bitte bei uns:
techcorner@max-it.de.
Über m.a.x. Informationstechnologie AG:
Als etabliertes Münchner Systemhaus zeichnen wir uns seit 1989 als verlässlicher IT-Partner mittelständischer und
großer Unternehmen aus. Unser Portfolio reicht von IT- Services über individuelle Softwareentwicklung bis hin zur ERP-Beratung.
Tags
.Net, SmtpClient, MailMessage, archive, EML, store to disk