2008-08-19 22 views
16

Necesito leer el archivo .MSG de Outlook en .NET sin usando 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.Lectura de archivos .msg

Respuesta

9

Actualización: he encontrado una tercera biblioteca COM partido llamado Outlook Redemption que está trabajando muy 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.

+0

wow, lo probé y es muy fácil de usar. Agregaré una respuesta con un bit de código de arnés de prueba. – Knox

0

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 comprobado al menos)

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

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

+1

Creo thats .eml archivos .msg son binarios –

+0

Lo son, pero él es correcto Pruébalo y compruébalo – rotard

3

Es un documento de "Almacenamiento estructurado". He utilizado con éxito Andrew Peace's code 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 diferentes tipos de mensajes darán lugar a registros diferentes ...

10

Hay un código disponible en CodeProject para leer archivos .msg sin COM. Ver here.

+1

no está mal (¡es gratis y de código abierto!) Pero no admite ninguno de los campos de fecha en un mensaje (todavía) –

+0

Con una pequeña modificación, esto también puede guardar los archivos adjuntos (ahora mismo solo muestra si hay alguno, y tamaño). –

+0

@Steve un comentarista compartió las instrucciones para obtener la fecha de envío/recepción aquí: http://www.codeproject.com/Articles/32899/Reading-an-Outlook-MSG-File-in-C?msg=2932319#xx2932319xx (desplácese hasta el final) – Ciaran

8

Aquí hay algunos ejemplos de código VBA usando Outlook Redemption 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 
1

Puede probar nuestra biblioteca (comercial) Rebex Secure Mail. Puede leer el formato MSG de Outlook. Código siguiente 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); 

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