2009-08-20 17 views
8

Estoy creando eml y guardándolos en un directorio utilizando el procedimiento mencionado en here. Quiero saber cómo enviar estos archivos eml? Intenté usar el objeto de la clase SMTPClient pero toma el objeto MailMessage como su parámetro y no pude encontrar y crear un objeto de tipo MailMessage usando estos archivos eml guardados.Enviar archivos eml guardados en el disco

Respuesta

6

Usa EMLReader para recuperar datos del archivo .eml. Contiene todos los datos que necesita para crear un objeto MailMessage como Desde, Hasta, Asunto, Cuerpo & mucho más.

FileStream fs = File.Open(filePath, FileMode.Open, FileAccess.ReadWrite); 
EMLReader reader = new EMLReader(fs); 
fs.Close(); 

MailMessage message = new System.Net.Mail.MailMessage(reader.From, reader.To, reader.Subject, reader.Body); 
+2

El código provisto no maneja vistas alternativas o archivos adjuntos. El artículo vinculado especifica que está obsoleto y enlaza con otro (http://www.codeproject.com/KB/office/EML_ReaderEx.aspx) que maneja mejor las vistas alternativas y los archivos adjuntos, pero todavía tiene algunos problemas (el BCC parece estar restaurado incorrectamente como destinatario "a") – iammichael

+2

Sí, lo sé. Solo estaba tratando de ayudar a alguien más (como yo) que se encuentra con esto cuando intenta encontrar una solución al mismo problema. Véase también la pregunta relacionada: http://stackoverflow.com/questions/936422/recommendations-on-parsing-eml-files-in-c – iammichael

7

Cargando correctamente un archivo EML no es tan fácil como parece. Puede escribir una implementación que funcione en 95% de casos en pocos días. Restante 5% tomaría al menos varios meses ;-). Lo sé, porque estoy involucrado en el desarrollo de uno.

considerar seguir dificulities:

  • correos electrónicos Unicode
  • idiomas de derecha a izquierda
  • corrección de archivos EML malformaciones causadas por errores bien conocidos en los clientes de correo populares y servidores
  • se ocupan de S/MIME (mensajes de correo electrónico cifrados y firmados)
  • que trata correctamente con varios métodos de codificación de archivos adjuntos
  • tratar con las imágenes en línea y hojas de estilo incrustadas en mensajes de correo electrónico HTML
  • asegurándose de que se analiza correctamente un MIME torture message de Mike Crispin (coautor de Mimo y IMAP RFC)
  • asegurándose de que mensaje incorrecto no resultará en tampón infestadas o en otra aplicación estrellan
  • manejo de mensajes jerárquicos (mensaje con mensajes adjuntos)
  • asegurándose de que se usa bien muy correos electrónicos de gran

maduración de tales analizador lleva años y retroalimentación continua para sus usuarios . En este momento no se incluye dicho analizador en .NET Framework. Hasta que cambie, me gustaría obtener un analizador MIME de terceros de un proveedor establecido.

El código siguiente utiliza nuestro Rebex Secure Mail component, pero estoy seguro de que una tarea similar podría replicarse fácilmente con componentes de otros proveedores también.

El código está basado en Mail Message tutorial.

// create an instance of MailMessage 
MailMessage message = new MailMessage(); 

// load the message from a local disk file 
message.Load("c:\\message.eml"); 

// send message 
Smtp.Send(message, "smtp.example.org"); 
+1

Hola Martin, has probado este código message.Load(). No hay tal método. Por favor intente con su código y luego publique. –

+1

@Vikrant El código funciona bien. Utiliza la clase Rebex.Mail.MailMessage que tiene el método Load desde la versión 1.0. Se menciona en la publicación justo arriba del código. Tal vez te refieres a que System.Net.Mail.MailMessage no tiene un método Load. Lo sé, esa es la razón exacta por la que mi respuesta utiliza una clase diferente. –

1

Do What I did ... give up.

La construcción del objeto MailMessage parece ser el enfoque que tengo una serie de preguntas similares pendientes de aquí también ... How do i send an email when i already have it as a string?

Por lo que he visto la forma más sencilla de hacerlo es utilizar un conector directo a volcar todo el contenido del archivo .eml hasta el servidor de correo como está y dejar que el servidor de correo entienda las cosas difíciles como desde, sujeto, ect analizando el correo electrónico usando su motor.

El único problema ...RFC 821 ... tanto dolor, estoy tratando de encontrar una manera limpia de hacerlo y leer rápidamente el correo que ya está en el buzón.

EDIT:

he encontrado una solución limpia y cubierta en mi hilo :)

How do i send an email when i already have it as a string?

0

Para los registros:

En Nuget empaquetador de escritura de la consola:

Install-Package LumiSoft.Net.dll 

Luego en su código:

using (FileStream fs = new FileStream(cacheFileName, FileMode.Open, FileAccess.Read)) 
using (LumiSoft.Net.SMTP.Client.SMTP_Client client = 
    new LumiSoft.Net.SMTP.Client.SMTP_Client()) 
{ 
    client.SendMessage(fs); 
} 
1

Si usted es una tienda de Microsoft y tienen un servidor Exchange de todos modos, entonces no hay otra solución que es mucho, mucho más fácil que todo lo que aquí se sugiere:

Cada servidor de Exchange ha configurado un directorio de recogida De la caja.
Por defecto, es %ExchangeInstallPath%TransportRoles\Pickup.

Copie los archivos .eml a ese directorio y Exchange enviará automáticamente los correos.


leer este artículo de TechNet para obtener más información:
Pickup directory and Replay directory

0

Como otros han demostrado, EML no es sólo una buena manera de serialize un mensaje de correo. Puede ser mejor guardando sus correos en otro formato. Si bien hay varios motores de serialización en .Net Framework para serializar cualquier objeto, también puede considerar simplemente guardar los componentes de sus correos, como direcciones, cuerpo, archivos para adjuntar en base64, en un archivo Xml de su propio diseño.

A continuación se muestra un ejemplo para empezar:

<?xml version="1.0" encoding="utf-8"?> 
    <mail> 
     <to display="Thomas Edison" address="[email protected]" /> 
     <body> 
     Hi Thomas, 
     How are you doing? 
     Bye 
     </body> 
     <attachment name="MaryLamb.wav"> 
     cmF0aWUgYWFuIGluIFBERi1mb3JtYWF0LiBEZSBmYWN0dXVyIGlzIGVlbiBvZmZpY2ll 
     ZWwgZ2VzaWduZWVyZA0KZG9jdW1lbnQgdmFuIEV1cm9maW5zIE9tZWdhbSBCVi4gRGUg 
     c2lnbmF0dXJlIGt1bnQgdSB2ZXJpZmnDq3Jlbi4NCg0KVm9vciBoZXQgdmVyaWZpw6ty 
     ... 
     </attachment> 
    </mail> 

ventaja adicional sería que, al contrario que con la creación de EML, no es necesario el SMTPClient para construir los archivos de correo concepto.

Xml es extremadamente fácil de crear y analizar en C#.

No mencionó la razón de guardar EML. Si el archivado a largo plazo sería un objetivo, xml podría tener una ventaja.

Cuestiones relacionadas