it-swarm.com.de

So speichern Sie das MailMessage-Objekt als * .eml- oder * .msg-Datei auf der Festplatte

Wie speichere ich ein MailMessage-Objekt auf der Festplatte? Das MailMessage-Objekt macht keine Save () - Methoden verfügbar. 

Ich habe kein Problem, wenn in irgendeinem Format * .eml oder * .msg gespeichert wird. Irgendeine Idee, wie das geht?

77
ashwnacharya

Der Einfachheit halber zitiere ich einfach eine Erklärung aus einem Connect-Element :

Sie können das .__ tatsächlich konfigurieren. SmtpClient zum Senden von E-Mails an die Datei System anstelle des Netzwerks. Sie können programmgesteuert mit der folgenden Code:

SmtpClient client = new SmtpClient("mysmtphost");
client.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory;
client.PickupDirectoryLocation = @"C:\somedirectory";
client.Send(message);

Sie können dies auch in Ihrem .__ einrichten. Anwendungskonfigurationsdatei wie diese:

 <configuration>
     <system.net>
         <mailSettings>
             <smtp deliveryMethod="SpecifiedPickupDirectory">
                 <specifiedPickupDirectory pickupDirectoryLocation="C:\somedirectory" />
             </smtp>
         </mailSettings>
     </system.net>
 </configuration>

Nach dem Senden der E-Mail sollten Sie Siehe E-Mail-Dateien, die dem .__ hinzugefügt werden. Verzeichnis, das Sie angegeben haben. Sie können dann lassen Sie einen separaten Prozess die E-Mail-Nachrichten im Stapelmodus.

Sie sollten den leeren Konstruktor anstelle des aufgelisteten verwenden können, da er ihn sowieso nicht sendet.

113
Ryan Versaw

Hier ist eine Erweiterungsmethode, um eine MailMessage in einen Stream zu konvertieren, der die EML-Daten enthält .. _. Es ist offensichtlich ein bisschen hackend, da das Dateisystem verwendet wird, aber es funktioniert.

public static void SaveMailMessage(this MailMessage msg, string filePath)
{
    using (var fs = new FileStream(filePath, FileMode.Create))
    {
        msg.ToEMLStream(fs);
    }
}

/// <summary>
/// Converts a MailMessage to an EML file stream.
/// </summary>
/// <param name="msg"></param>
/// <returns></returns>
public static void ToEMLStream(this MailMessage msg, Stream str)
{
    using (var client = new SmtpClient())
    {
        var id = Guid.NewGuid();

        var tempFolder = Path.Combine(Path.GetTempPath(), Assembly.GetExecutingAssembly().GetName().Name);

        tempFolder = Path.Combine(tempFolder, "MailMessageToEMLTemp");

        // create a temp folder to hold just this .eml file so that we can find it easily.
        tempFolder = Path.Combine(tempFolder, id.ToString());

        if (!Directory.Exists(tempFolder))
        {
            Directory.CreateDirectory(tempFolder);
        }

        client.UseDefaultCredentials = true;
        client.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory;
        client.PickupDirectoryLocation = tempFolder;
        client.Send(msg);

        // tempFolder should contain 1 eml file

        var filePath = Directory.GetFiles(tempFolder).Single();

        // stream out the contents
        using (var fs = new FileStream(filePath, FileMode.Open))
        {
            fs.CopyTo(str);
        }

        if (Directory.Exists(tempFolder))
        {
            Directory.Delete(tempFolder, true);
        }
    }
}

Sie können dann den zurückgegebenen Stream mitnehmen und nach Belieben tun, z. B. an einem anderen Speicherort auf der Festplatte speichern oder in einem Datenbankfeld speichern oder sogar als Anhang per E-Mail versenden.

24
saille

Wenn Sie Mailkit verwenden. Schreiben Sie einfach den Code 

string fileName = "your filename full path";
MimeKit.MimeMessage message = CreateMyMessage ();
message.WriteTo (fileName);
2
Naveen Soni

Aus irgendeinem Grund schlug der Client.send fehl (direkt nach einem tatsächlichen Senden mit dieser Methode), also habe ich guten alten CDO- und ADODB-Stream angeschlossen. Ich musste auch CDO.message mit einer template.eml laden, bevor die .Message-Werte festgelegt wurden. Aber es funktioniert.

Da das obige C ist, ist es eines für VB

    MyMessage.From = New Net.Mail.MailAddress(mEmailAddress)
    MyMessage.To.Add(mToAddress)
    MyMessage.Subject = mSubject
    MyMessage.Body = mBody

    Smtp.Host = "------"
    Smtp.Port = "2525"
    Smtp.Credentials = New NetworkCredential(------)

    Smtp.Send(MyMessage)        ' Actual Send

    Dim oldCDO As CDO.Message
    oldCDO = MyLoadEmlFromFile("template.eml")  ' just put from, to, subject blank. leave first line blank
    oldCDO.To = mToAddress
    oldCDO.From = mEmailAddress
    oldCDO.Subject = mSubject
    oldCDO.TextBody = mBody
    oldCDO.HTMLBody = mBody
    oldCDO.GetStream.Flush()
    oldCDO.GetStream.SaveToFile(yourPath)
0
Gregory Way