Come salvare oggetto MailMessage su disco come * .eml o * file con estensione msg
-
13-09-2019 - |
Domanda
Come si salva oggetto MailMessage al disco? L'oggetto MailMessage non espone alcun metodo Save ().
Non ho un problema se si salva in qualsiasi formato, * .eml o * .msg. Qualsiasi idea di come fare questo?
Soluzione
Per semplicità, mi limiterò a citare un chiarimento da un Connect :
Si può effettivamente configurare la SMTPClient per inviare messaggi di posta elettronica al file sistema invece della rete. Puoi fare questo a livello di codice utilizzando il seguente codice:
SmtpClient client = new SmtpClient("mysmtphost"); client.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory; client.PickupDirectoryLocation = @"C:\somedirectory"; client.Send(message);
È anche possibile impostare questa funzione nella vostra file di configurazione dell'applicazione come in questo modo:
<configuration>
<system.net>
<mailSettings>
<smtp deliveryMethod="SpecifiedPickupDirectory">
<specifiedPickupDirectory pickupDirectoryLocation="C:\somedirectory" />
</smtp>
</mailSettings>
</system.net>
</configuration>
Dopo aver inviato l'e-mail, si dovrebbe vedono file di posta elettronica vengono aggiunti alla directory specificata. È quindi possibile avere un processo separato inviare la messaggi di posta elettronica in modalità batch.
Si dovrebbe essere in grado di utilizzare il costruttore vuoto al posto di quello indicato, in quanto non sarà l'invio comunque.
Altri suggerimenti
Ecco un metodo di estensione per convertire un MailMessage a un flusso contenente i dati EML. Il suo, ovviamente, un po 'di hack in quanto utilizza il file system, ma funziona.
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);
}
}
}
Si può quindi prendere il flusso questo è restituiti e fare quello che vuoi con esso, tra cui il salvataggio in un'altra posizione sul disco o la memorizzazione in un campo di database, o anche via email come allegato.
Se si utilizza Mailkit . Basta scrivere il codice in basso
string fileName = "your filename full path";
MimeKit.MimeMessage message = CreateMyMessage ();
message.WriteTo(fileName);
Per un motivo o per l'altro il client.send riuscita (a destra dopo un invio vero e proprio utilizzando tale metodo) così ho inserito in buona 'CDO ole e flusso ADODB. Ho anche dovuto caricare CDO.Message con un template.eml prima di impostare i valori .message. Ma funziona.
Da quanto sopra si è C ecco uno per 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)