c# outlook email message msg

c# - Leer desde archivos.msg



outlook email (7)

Si abre el archivo .MSG en un editor de texto, creo que encontrará que la información que está buscando se almacena como texto sin formato dentro del archivo. (Es en todos los mensajes que he revisado al menos)

Sería bastante fácil escribir algún código para analizar el archivo buscando líneas que comiencen con "De:" o "Para:" etc. y luego extraer la información que necesita.

Si también necesita el cuerpo del correo electrónico, eso puede ser un poco más complicado.

Necesito leer el archivo .MSG de Outlook en .NET sin utilizar la API COM para Outlook (ya que no se instalará en las máquinas en las que se ejecutará mi aplicación). ¿Hay bibliotecas gratuitas de terceros para hacer eso? Quiero extraer los campos From, To, CC y BCC. Los campos de fecha de envío / recepción serían buenos si también están almacenados en archivos MSG.


Es un documento de "Almacenamiento estructurado". He utilizado con éxito el código de Andrew Peace para leer estos en el pasado, incluso bajo .NET (usando C ++ / CLI) - es limpio y bastante fácil de entender. Básicamente, necesita averiguar qué registros necesita y consultarlos; se pone un poco complicado, ya que las diferentes versiones de Outlook y los diferentes tipos de mensajes darán lugar a registros diferentes ...


Actualización: he encontrado una biblioteca COM de terceros llamada Outlook Redemption que funciona bien para mí en este momento. Si lo usa a través de COM-Interop en .NET, no olvide liberar cada objeto COM una vez que haya terminado con él, de lo contrario, su aplicación se bloquea al azar.



Hay código disponible en CodeProject para leer archivos .msg sin COM. Mira aquí .


Puede probar nuestra biblioteca Rebex Secure Mail (comercial). Puede leer el formato MSG de Outlook. El siguiente código muestra cómo:

// Load message MailMessage message = new MailMessage(); message.Load(@"c:/Temp/t/message.msg"); // show From, To and Sent date Console.WriteLine("From: {0}", message.From); Console.WriteLine("To: {0}", message.To); Console.WriteLine("Sent: {0}", message.Date.LocalTime); // find and try to parse the first ''Received'' header MailDateTime receivedDate = null; string received = message.Headers.GetRaw("Received"); if (received != null) { int lastSemicolon = received.LastIndexOf('';''); if (lastSemicolon >= 0) { string rawDate = received.Substring(lastSemicolon + 1); MimeHeader header = new MimeHeader("Date", rawDate); receivedDate = header.Value as MailDateTime; } } // display the received date if available if (receivedDate != null) Console.WriteLine("Received: {0}", receivedDate.LocalTime);

Se puede encontrar más información sobre las fechas de envío y recepción y cómo se representan en el mensaje en http://forum.rebex.net/questions/816/extract-senttime-receivetime-and-time-zones


Aquí hay un código de ejemplo de VBA que usa el canje de Outlook que Huseyint encontró.

Public Sub ProcessMail() Dim Sess As RDOSession Dim myMsg As RDOMail Dim myString As String Set Sess = CreateObject("Redemption.RDOSession") Set myMsg = Sess.GetMessageFromMsgFile("C:/TestHarness/kmail.msg") myString = myMsg.Body myMsg.Body = Replace(myString, "8750", "XXXX") myMsg.Save End Sub