c# .net email mailmessage eml

c# - Cómo guardar el objeto MailMessage en el disco como archivo*.eml o*.msg



.net email (3)

Aquí hay un método de extensión para convertir un MailMessage en una transmisión que contiene los datos EML. Obviamente es un truco porque usa el sistema de archivos, pero funciona.

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); } } }

A continuación, puede tomar la secuencia que se devuelve y hacer lo que quiera con ella, incluido guardar en otra ubicación en el disco o almacenarla en un campo de base de datos, o incluso enviar un correo electrónico como un archivo adjunto.

¿Cómo guardo el objeto MailMessage en el disco? El objeto MailMessage no expone ningún método Save ().

No tengo ningún problema si se guarda en cualquier formato, * .eml o * .msg. ¿Alguna idea de cómo hacer esto?


Por una u otra razón, el client.send falló (justo después de un envío real usando ese método) así que conecté un buen flujo de CDO y ADODB. También tuve que cargar CDO.message con template.eml antes de configurar los valores de .Message. Pero funciona.

Como el anterior es C aquí hay uno para 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)


Para simplificar, solo citaré una explicación de un elemento de Connect :

En realidad, puede configurar el SmtpClient para enviar correos electrónicos al sistema de archivos en lugar de a la red. Puedes hacer esto programáticamente usando el siguiente código:

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

También puede configurar esto en su archivo de configuración de la aplicación de esta manera:

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

Después de enviar el correo electrónico, debería ver que los archivos de correo electrónico se agregan al directorio que especificó. A continuación, puede tener un proceso separado para enviar los mensajes de correo electrónico en modo por lotes.

Debería poder utilizar el constructor vacío en lugar del que figura en la lista, ya que no lo enviará de todos modos.