Чтение из .msg файлов [закрыто]

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

19.08.2008 08:07:28
7 ОТВЕТОВ

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

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

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

0
19.08.2008 08:24:37
Я полагаю, что .eml файлы .msg являются двоичными
Anthony Main 10.06.2009 21:52:29
Они есть, но он прав. Попробуйте и убедитесь сами
gillonba 13.07.2010 19:09:19

Microsoft задокументировала это: Спецификация формата файла .MSG

6
10.06.2009 22:26:12
РЕШЕНИЕ

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

9
21.08.2008 13:27:06

Это документ «Структурированное хранилище». Я успешно использовал код Эндрю Мира, чтобы читать их в прошлом, даже в .NET (с использованием C ++ / CLI) - он чистый и довольно простой для понимания. По сути, вам нужно выяснить, какие записи вам нужны, и запросить их - это становится немного сложновато, поскольку разные версии Outlook и разные типы сообщений приводят к разным записям ...

3
21.08.2008 18:25:08

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

10
22.10.2009 22:27:30
это неплохо (это бесплатно и с открытым исходным кодом!), но не поддерживает ни одно из полей даты в сообщении (пока)
Steve Casey 7.06.2010 23:13:48
С небольшой модификацией это также может сохранить вложения (сейчас они просто отображают их наличие и размер).
James Skemp 24.03.2012 13:37:01
@ Один комментатор поделился инструкциями для получения даты отправки / получения здесь: codeproject.com/Articles/32899/… (прокрутите до конца)
Ciaran 3.07.2013 13:33:39
@ Кьяран вау, взрыв из прошлого. с тех пор, к счастью, мне никогда не нужно было приближаться к чему-то близкому;)
Steve Casey 10.07.2013 23:38:21

Вот пример кода 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
8
2.03.2016 21:24:53
Разве это не тема C #?
Ollie Beumkes 22.05.2018 10:29:26

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

// 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.

1
7.04.2011 14:08:30