Frage

Wie speichere ich Mailmessage-Objekt auf die Festplatte? Das Mailmessage-Objekt keine Save () Methoden aussetzen.

Ich habe nicht ein Problem haben, wenn es in einem beliebigen Format speichert, * EML oder * msg. Jede Idee, wie dies zu tun?

War es hilfreich?

Lösung

Der Einfachheit halber werde ich zitiere nur eine Erklärung von einem Connect Artikel :

  

Sie können die tatsächlich konfigurieren   in die Datei SmtpClient E-Mails senden   System anstelle des Netzes. Du kannst   tun dies programmatisch die Verwendung von   folgenden Code:

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

Sie können auch diese einrichten in Ihrem   Anwendungskonfigurationsdatei wie   folgt aus:

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

Nachdem die E-Mail zu senden, sollten Sie   siehe E-Mail-Dateien werden hinzugefügt, um die   Ihnen angegebenen Verzeichnis. Sie können dann   haben einen separaten Prozess auszusenden die   E-Mail-Nachrichten im Batch-Modus.

Sie sollten den leeren Konstruktor statt der aufgeführten nutzen können, da es nicht es trotzdem senden werden.

Andere Tipps

Hier ist eine Erweiterung Methode eine Mailmessage zu einem Strom wandeln die EML-Daten enthält. Sein offensichtlich ein bisschen wie ein Hack, wie es verwendet das Dateisystem, 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 Strom, das ist zurück und tun, was man will, auch an einem anderen Speicherort auf der Festplatte zu speichern oder in einem Datenbankfeld zu speichern, oder sogar als Anhang per E-Mail.

Wenn Sie mit Mailkit . Schreiben Sie einfach unten Code

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

Für einen oder anderen Grund die client.send fehlgeschlagen (gleich nach einer tatsächlichen Sende mit dieser Methode) so eingesteckt ich in guten ‚ole CDO und ADODB Stream. Ich hatte auch CDO.Message mit einem template.eml, bevor Sie die .Message Werte zu laden. Aber es funktioniert.

Da die oben ein C ist hier ist eine 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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top