Подтвердить что ты не робот

Чтение из файлов .msg

Мне нужно прочитать из файла Outlook.MSG в .NET без использования COM API для Outlook (поскольку он не будет установлен на машинах, которые будет запущено моим приложением). Есть ли свободные сторонние библиотеки для этого? Я хочу извлечь поля From, To, CC и BCC. Поля "Отправленные" и "Дата получения" были бы хорошими, если они также хранятся в файлах MSG.

4b9b3361

Ответ 1

Обновление: Я нашел стороннюю библиотеку COM, называемую Outlook Redemption, которая отлично работает для меня на момент. Если вы используете его через COM-Interop в .NET, не забудьте выпустить каждый COM-объект после того, как вы закончите с ним, иначе ваше приложение аварийно сработает.

Ответ 2

В CodeProject доступен код для чтения файлов .msg без COM. См. здесь.

Ответ 3

Вот пример кода VBA с использованием Outlook Redemption, который нашел 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

Ответ 5

Это документ "Структурированное хранилище". Я успешно использовал код Andrew Peace, чтобы прочитать их в прошлом, даже в .NET(с использованием С++/CLI) - он чист и честен Легко понять. В принципе, вам нужно выяснить, какие записи вам нужны, и запросить их - он становится немного волосатым, поскольку разные версии Outlook и различные типы сообщений приведут к разным записям...

Ответ 6

Вы можете попробовать нашу (коммерческую) Rebex Secure Mail. Он может читать формат MS Outlook. Следующий код показывает, как:

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

Дополнительная информация о датах отправленных и полученных и о том, как они представлены в сообщении, находится в http://forum.rebex.net/questions/816/extract-senttime-receivetime-and-time-zones

Ответ 7

Если вы открываете файл .MSG в текстовом редакторе, я считаю, что вы обнаружите, что информация, которую вы используете, хранится как обычный текст внутри файла. (Это все сообщения, которые я проверил как минимум)

Было бы довольно легко написать некоторый код для анализа файла, ищущего строки, начинающиеся с "From:" или "To:" и т.д., а затем извлечение необходимой информации.

Если вам понадобится тело письма, это может быть немного сложнее.