2009-08-12 40 views

Respuesta

102

Por simplicidad, sólo voy a citar una explicación de un Connect item:

En realidad se puede configurar el SmtpClient para enviar mensajes de correo electrónico al sistema en lugar de la red de archivos . Puede hacerlo 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 esta opción en el archivo de configuración 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 los archivos de correo electrónico se agregan al directorio que ha especificado. Puede entonces tener un proceso separado enviar los mensajes de correo electrónico en modo por lotes.

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

+1

me he dado cuenta que yo también tenía que añadir el

+8

¿Hay alguna forma de cambiar el nombre del archivo de salida .eml? Preferiría que no se pareciera a lo siguiente: f80f4695-551c-47d7-8879-40ad89707b23.eml ¡Gracias! – buzzzzjay

+6

Aunque una publicación anterior, me gustaría añadir una respuesta a la última pregunta de @buzzzzjay: echa un vistazo aquí: [link] (http://www.codeproject.com/Articles/32434/Adding-Save-functionality- to-Microsoft-Net-Mail-Ma) –

22

Aquí hay un método de extensión para convertir un MailMessage a una secuencia que contiene los datos EML. Obviamente es un poco 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); 
     } 
    } 
} 

, entonces 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.

+1

Hola, Saille ... Tu código funciona bien y sí, está creando el archivo eml o Msg, pero no puedo abrirlo en MS Outlook :(Necesito tu ayuda para hacerlo. –

+2

.El archivo .EML debería abrirse en Outlook, pero si no puedes, intenta cambiar el nombre de la extensión de archivo a.MHT, luego ábralo en Internet Explorer. – saille

+0

Saille: ¿es posible guardar sin una dirección "desde", por lo que se puede enviar desde el usuario que la abre? Aclamaciones. –

0

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.

Desde la anterior es C aquí es uno de 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) 
Cuestiones relacionadas