Ecco un metodo di estensione per convertire un oggetto MailMessage in un flusso contenente i dati EML. Ovviamente è un po 'un hack perché usa 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.
Ho scoperto che ho anche bisogno di aggiungere il
C'è un modo per cambiare il nome del file .eml in uscita? Preferisco che non assomigli al seguente: f80f4695-551c-47d7-8879-40ad89707b23.eml Grazie! – buzzzzjay
Sebbene sia un vecchio post, vorrei aggiungere una risposta all'ultima domanda da @buzzzzjay: dai uno sguardo qui: [link] (http://www.codeproject.com/Articles/32434/Adding-Save-functionality- to-Microsoft-Net-Mail-Ma) –