.Net MailMessage-Objekt als EML-Datei speichern: Unterschied zwischen den Versionen

Aus maxTechCorner
Keine Bearbeitungszusammenfassung
imported>TechCorner-Redaktion
Server-Software: Überarbeitung
 
(8 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
==='''Symptom'''===
== 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.
Von einem Webserver erzeugte E-Mails können wegen eines Fehlers (Netzwerk, Programm) nicht verschickt werden und gehen sofort verloren – das erschwert die Fehlersuche.
==='''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. <br />
== Ursache und Lösung ==
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.<br />
Tritt ein Fehler beim Versand auf, lässt sich der Fehler zwar protokollieren, die Original-Mail ist aber verloren. Abhilfe: das <code>MailMessage</code>-Objekt für die Analyse als '''EML-Datei''' speichern. EML-Dateien enthalten die komplette Mail inkl. Kopfdaten und lassen sich mit Outlook oder Thunderbird öffnen. Über eine Erweiterungsklasse lässt sich das direkt umsetzen:
Mithilfe der statischen Erweiterungsklasse „MailMessageExtensions“ kann ein MailMessage-Objekt direkt als EML-Datei gespeichert werden.
<syntaxhighlight lang="csharp">
<pre>using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Mail;
using System.Net.Mail;
using System.Text;


namespace MaxIt.TechCorner
namespace MaxIt.TechCorner
{
{
public static class MailMessageExtensions
    public static class MailMessageExtensions
{
    {
 
        /// <summary>Stores a MailMessage as EML file.</summary>
/// <summary>
        public static void Archive(this MailMessage message)
/// Stores a MailMessage as EML file.
        {
/// </summary>
            using (SmtpClient diskclient = new SmtpClient("mysmtphost"))
/// <param name="message">The MailMessage object to be stored.</param>
            {
public static void Archive(this MailMessage message)
                diskclient.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory;
{
                diskclient.PickupDirectoryLocation = @"%TEMP%\mails";
using (SmtpClient diskclient = new SmtpClient("mysmtphost"))
                diskclient.Send(message);
{
            }
diskclient.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory;
        }
diskclient.PickupDirectoryLocation = "%TEMP%\\mails";
    }
diskclient.Send(message);
}
}
}
}
}
</pre>
</syntaxhighlight>
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.<br />
Durch <code>DeliveryMethod = SpecifiedPickupDirectory</code> wird die Mail beim „Versand“ als EML-Datei im Pfad <code>PickupDirectoryLocation</code> abgelegt. Verwendung im Fehlerfall:
Verwendet wird die Erweiterung, indem deren Namespace eingebunden und im Code die Archive()-Methode für das MailMessage-Objekt aufgerufen wird:
<syntaxhighlight lang="csharp">
<pre>System.Net.Mail.SmtpClient smtpclient;
System.Net.Mail.MailMessage message;
 
// ...
 
try
try
{
{
// Try to send message
    smtpclient.Send(message);
smtpclient.Send(message);
}
}
catch (Exception ex)
catch (Exception ex)
{
{
// Archive message
    message.Archive();   // Mail zur Fehlersuche als EML sichern
message.Archive();
}
}
</pre>
</syntaxhighlight>
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.
So steht neben den Log-Meldungen auch die E-Mail selbst (inkl. Anhänge) zur Analyse bereit.
==='''Weitere Informationen'''===
https://www.max-it.de/managed-services/anwender-und-netzwerk/
 
=== '''Kontakt''' ===
Wenn Sie Fragen oder Anmerkungen zu diesem Artikel haben, melden Sie sich bitte bei uns: mailto:techcorner@max-it.de.<br />


Über m.a.x. Informationstechnologie AG: <br />
== Unterstützung von m.a.x. it ==
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.<br />
Bei diesem Thema unterstützt Sie die [https://www.max-it.de/development/individuelle-softwareentwicklung/ individuelle Softwareentwicklung] von m.a.x. it.
=== '''Tags''' ===
.Net, SmtpClient, MailMessage, archive, EML, store to disk


{{Uebermax}}
[[Kategorie:Server-Software]]


[[Kategorie: Server-Software]]

Aktuelle Version vom 15. September 2026, 00:00 Uhr

Symptom

Von einem Webserver erzeugte E-Mails können wegen eines Fehlers (Netzwerk, Programm) nicht verschickt werden und gehen sofort verloren – das erschwert die Fehlersuche.

Ursache und Lösung

Tritt ein Fehler beim Versand auf, lässt sich der Fehler zwar protokollieren, die Original-Mail ist aber verloren. Abhilfe: das MailMessage-Objekt für die Analyse als EML-Datei speichern. EML-Dateien enthalten die komplette Mail inkl. Kopfdaten und lassen sich mit Outlook oder Thunderbird öffnen. Über eine Erweiterungsklasse lässt sich das direkt umsetzen:

using System.Net.Mail;

namespace MaxIt.TechCorner
{
    public static class MailMessageExtensions
    {
        /// <summary>Stores a MailMessage as EML file.</summary>
        public static void Archive(this MailMessage message)
        {
            using (SmtpClient diskclient = new SmtpClient("mysmtphost"))
            {
                diskclient.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory;
                diskclient.PickupDirectoryLocation = @"%TEMP%\mails";
                diskclient.Send(message);
            }
        }
    }
}

Durch DeliveryMethod = SpecifiedPickupDirectory wird die Mail beim „Versand“ als EML-Datei im Pfad PickupDirectoryLocation abgelegt. Verwendung im Fehlerfall:

try
{
    smtpclient.Send(message);
}
catch (Exception ex)
{
    message.Archive();   // Mail zur Fehlersuche als EML sichern
}

So steht neben den Log-Meldungen auch die E-Mail selbst (inkl. Anhänge) zur Analyse bereit.

Unterstützung von m.a.x. it

Bei diesem Thema unterstützt Sie die individuelle Softwareentwicklung von m.a.x. it.


Über m.a.x. it Die m.a.x. Informationstechnologie AG ist seit über 30 Jahren IT-Partner mittelständischer und großer Unternehmen in München und bietet maßgeschneiderte Lösungen und Services in den Bereichen Cloud, Cybersecurity, Netzwerk, Windows, Linux und Softwareentwicklung. Sie haben eine Frage zu diesem Artikel oder brauchen Unterstützung? Kontakt aufnehmen