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?

¿Fue útil?

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top