Wie Mailmessage-Objekt auf der Festplatte als * EML oder * .msg-Datei speichern
-
13-09-2019 - |
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?
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)