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.
Microsoft ha documentado esto: Especificación de formato de archivo .MSG
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