Cómo ahorrar objeto MailMessage en el disco como * .eml o archivo * .msg
-
13-09-2019 - |
Pregunta
¿Cómo puedo guardar objetos MailMessage en el disco? El objeto MailMessage no expone ningún método Save ().
No tengo un problema si se ahorra en cualquier formato, * .eml o .msg *. ¿Alguna idea de cómo hacer esto?
Solución
Para simplificar, sólo voy a citar una explicación de un tema Conectar :
Puede configurar la realidad SMTPClient para enviar mensajes de correo electrónico al archivo sistema en lugar de la red. Usted puede hacer esto mediante programación utilizando 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 como esto:
<configuration>
<system.net>
<mailSettings>
<smtp deliveryMethod="SpecifiedPickupDirectory">
<specifiedPickupDirectory pickupDirectoryLocation="C:\somedirectory" />
</smtp>
</mailSettings>
</system.net>
</configuration>
Después de enviar el correo electrónico, debe ver archivos de correo electrónico se añaden a la directorio especificado. A continuación, puede tener un proceso separado enviar el mensajes de correo electrónico en modo batch.
Usted debe ser capaz de utilizar el constructor vacío en vez de la lista, ya que no será el envío de todos modos.
Otros consejos
Aquí es un método de extensión para convertir un MailMessage a una corriente que contiene los datos EML. Su obviamente un poco de un truco, ya que utiliza 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 corriente de eso regresaron y hacer lo que quiera con él, incluyendo el ahorro a otra ubicación en el disco o almacenamiento en un campo de base de datos, o incluso enviando un correo electrónico como archivo adjunto.
Si está utilizando Mailkit . Sólo tiene que escribir a continuación el código
string fileName = "your filename full path";
MimeKit.MimeMessage message = CreateMyMessage ();
message.WriteTo(fileName);
Por una razón u otra no la client.send (justo después de un envío real utilizando ese método) por lo enchufé buena 'ole CDO y corriente ADODB. También tuve que cargar con un CDO.Message template.eml antes de ajustar los valores de .Message. Pero funciona.
Desde la de arriba es C aquí es 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)