Leer desde archivos .msg [cerrado]
Pregunta
Necesito leer desde el archivo .MSG de Outlook en .NET sin usando COM API para Outlook (porque no se instalará en las máquinas en las que se ejecutará mi aplicación).¿Existen bibliotecas gratuitas de terceros para hacer eso?Quiero extraer los campos De, Para, CC y CCO.Los campos de fecha de envío/recepción serían buenos si también se almacenaran en archivos MSG.
Solución 2
Actualizar: Encontré una biblioteca COM de terceros llamada Redención de perspectivas que me está funcionando bien en este momento.Si lo usa a través de COM-Interop en .NET, no olvide liberar todos los objetos COM una vez que haya terminado; de lo contrario, su aplicación fallará aleatoriamente.
Otros consejos
Hay código disponible en CodeProject para leer archivos .msg sin COM.Ver aquí.
Aquí hay un ejemplo de código VBA usando Redención de perspectivas que encontró Huseyint.
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
Microsoft ha documentado esto: Especificación de formato de archivo .MSG
Es un documento de "almacenamiento estructurado".He utilizado con éxito El código de Andrew Peace. para leerlos en el pasado, incluso bajo .NET (usando C++/CLI): es limpio y bastante fácil de entender.Básicamente, necesita determinar qué registros necesita y consultarlos; se vuelve un poco complicado, ya que diferentes versiones de Outlook y diferentes tipos de mensajes darán como resultado diferentes registros...
Puedes probar nuestro (comercial) Correo seguro de Rebex biblioteca.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);
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
Si abre el archivo .MSG en un editor de texto, creo que encontrará que la información que busca se almacena como texto sin formato dentro del archivo.(Está al menos en todos los mensajes que he revisado)
Sería bastante fácil escribir 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, puede resultar un poco más complicado.