Чтение из файлов .msg
Мне нужно прочитать файл Outlook .MSG в .NET без использования COM API для Outlook (потому что он не будет установлен на машинах, на которых будет работать мое приложение). Существуют ли для этого бесплатные сторонние библиотеки? Я хочу извлечь поля From, To, CC и BCC. Поля даты отправки / получения были бы хороши, если бы они также были сохранены в файлах MSG.
Ответов (7)7
Обновление: я нашел стороннюю библиотеку COM под названием Outlook Redemption, которая в настоящий момент у меня работает нормально. Если вы используете его через COM-Interop в .NET, не забудьте освободить каждый COM-объект после того, как закончите с ним, иначе ваше приложение выйдет из строя случайным образом.
Вот пример кода VBA с использованием Outlook Redemption, который нашел Хусейнт.
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
Если вы откроете файл .MSG в текстовом редакторе, я полагаю, вы обнаружите, что информация, которую вы ищете, хранится в виде простого текста внутри файла. (Это по крайней мере во всех сообщениях, которые я проверял)
Было бы довольно легко написать код для анализа файла в поисках строк, начинающихся с «От:» или «Кому:» и т. Д., А затем извлечения необходимой информации.
Если вам также нужно тело письма, это может быть немного сложнее.
Microsoft задокументировала это: Спецификация формата файла .MSG
Это документ «Структурированное хранилище». Я успешно использовал код Эндрю Писа, чтобы читать их в прошлом, даже в .NET (используя C++ / CLI) - он чистый и довольно простой для понимания. По сути, вам нужно выяснить, какие записи вам нужны, и запросить их - это становится немного сложным, поскольку разные версии Outlook и разные типы сообщений приведут к разным записям ...
В CodeProject есть код для чтения файлов .msg без COM. Смотрите здесь .
Вы можете попробовать нашу (коммерческую) библиотеку Rebex Secure Mail . Он может читать формат Outlook MSG. Следующий код показывает, как:
// 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.