Pergunta

Preciso ler o arquivo .MSG do Outlook no .NET sem usando COM API para Outlook (porque ele não será instalado nas máquinas em que meu aplicativo será executado).Existem bibliotecas gratuitas de terceiros para fazer isso?Quero extrair os campos De, Para, CC e BCC.Os campos de data de envio/recebimento seriam bons se também fossem armazenados em arquivos MSG.

Foi útil?

Solução 2

Atualizar: Encontrei uma biblioteca COM de terceiros chamada Resgate do Outlook que está funcionando bem para mim no momento.Se você usá-lo via COM-Interop no .NET, não se esqueça de liberar todos os objetos COM depois de terminar, caso contrário, seu aplicativo travará aleatoriamente.

Outras dicas

Existe código disponível no CodeProject para leitura de arquivos .msg sem COM.Ver aqui.

Aqui está um exemplo de código VBA usando Resgate do Outlook que Huseyint encontrou.

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

A Microsoft documentou isso: Especificação de formato de arquivo .MSG

É um documento de "Armazenamento Estruturado".Eu usei com sucesso Código de Andrew Peace lê-los no passado, mesmo em .NET (usando C++/CLI) - é limpo e bastante fácil de entender.Basicamente, você precisa descobrir quais registros você precisa e consultá-los - fica um pouco complicado, já que diferentes versões do Outlook e diferentes tipos de mensagens resultarão em registros diferentes...

Você pode experimentar nosso (comercial) Correio Seguro Rebex biblioteca.Ele pode ler o formato MSG do Outlook.O código a seguir mostra como:

// 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);

Mais informações sobre as datas de envio e recebimento e como elas são representadas na mensagem podem ser encontradas em http://forum.rebex.net/questions/816/extract-senttime-receivetime-and-time-zones

Se você abrir o arquivo .MSG em um editor de texto, acredito que descobrirá que as informações que procura estão armazenadas como texto simples dentro do arquivo.(Está em todas as mensagens que verifiquei, pelo menos)

Seria muito fácil escrever algum código para analisar o arquivo procurando linhas começando com "From:" ou "To:" etc.e então extrair as informações que você precisa.

Se você também precisar do corpo do e-mail, isso pode ser um pouco mais complicado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top