Введение

Программное анализирование сообщений электронной почты является обычным требованием для архивных инструментов, трубопроводов соответствия и утилит миграции. Файлы Outlook MSG используют формат контейнера Compound File Binary (CFB) с потоками свойств MAPI, в то время как файлы EML следуют стандарту MIME. Оба формата требуют тщательной обработки кодировок, сложенных заголовков и гнездованных приложений.

Aspose.Email FOSS for .NET is a free, MIT-licensed C# library that provides a complete read-write API for MSG and EML messages. It targets .NET 8.0+ and has no dependency on Microsoft Outlook or any native COM interop layer. The library is available as the aspose.email.foss Нугетт-пакет.

В этом посте рассматриваются возможности анализа сообщений, включенные в библиотеку: от загрузки файлов с диска до извлечения отдельных свойств MAPI и конвертации между форматами.


Что входит в него?

Загрузка файлов MSG

В связи с этим MapiMessage class - это основная точка входа для работы с файлами Outlook MSG. Вы можете загрузить сообщение из пути файла или потока, с дополнительным значком строгой проверки, который обнаруживает любые структурные проблемы, найденные в файле.

// Load an MSG file from disk
var message = MapiMessage.FromFile("meeting-invite.msg");

Console.WriteLine($"Subject: {message.Subject}");
Console.WriteLine($"From: {message.SenderName} <{message.SenderEmailAddress}>");
Console.WriteLine($"Date: {message.MessageDeliveryTime}");
Console.WriteLine($"Recipients: {message.Recipients.Count}");
Console.WriteLine($"Attachments: {message.Attachments.Count}");

Вернувшиеся . MapiMessage выявляет типизированные свойства для общих полей, включая: Subject, Body, HtmlBody, SenderName, SenderEmailAddress, InternetMessageId, и MessageDeliveryTime.

Загрузка сообщений EML

Файлы EML используют формат MIME. MapiMessage.LoadFromEml принимает путь файла, а Stream, или а byte[] и возвращает то же самое. MapiMessage объект, так что вы используете один унифицированный API независимо от формата исхода.

// Load from a file path
var fromFile = MapiMessage.LoadFromEml("newsletter.eml");

// Load from a stream
using var stream = File.OpenRead("newsletter.eml");
var fromStream = MapiMessage.LoadFromEml(stream);

Console.WriteLine($"Subject: {fromStream.Subject}");
Console.WriteLine($"Body: {fromStream.Body?.Trim()}");

Анализчик обрабатывает свернутые заголовки, кодировку Base64 и котируемые печатные передачи, а также многополучательные поля To/Cc.

Работа с получателями и приложениями

После загрузки сообщения получатели и приложения доступны в виде коллекций с сильной типографией. MapiRecipient носят EmailAddress, DisplayName, и RecipientType Каждое поле. MapiAttachment предусматривает: Filename, Data, MimeType, и ContentId.

var message = MapiMessage.FromFile("report.msg");

foreach (var recipient in message.Recipients)
{
    Console.WriteLine($"  {recipient.DisplayName} <{recipient.EmailAddress}> (type={recipient.RecipientType})");
}

foreach (var attachment in message.Attachments)
{
    Console.WriteLine($"  {attachment.Filename} ({attachment.MimeType}, {attachment.Data.Length} bytes)");
    File.WriteAllBytes(attachment.Filename!, attachment.Data);
}

Также поддерживаются встроенные приложения сообщений. MapiAttachment.IsEmbeddedMessage - это … true, в том числе: EmbeddedMessage свойство возвращает гнездованный MapiMessage что вы можете осмотреть рекурсивно.

Доступ к свойствам MAPI

Для продвинутых сценариев, каждое сообщение, получатель и прилагательное выставляет на свет Properties сборка типа MapiPropertyCollection.Вы можете читать, добавлять и удалять отдельные свойства MAPI по их идентификатору собственности и коду типа.

var message = MapiMessage.FromFile("custom-props.msg");

// Iterate all properties on the message
foreach (var prop in message.Properties.IterProperties())
{
    Console.WriteLine($"Tag: 0x{prop.PropertyTag:X8}, Value: {prop.Value}");
}

// Read a specific property
var subject = message.Properties.Get(
    (ushort)CommonMessagePropertyId.Subject,
    (ushort)PropertyTypeCode.PtypString);

В связи с этим CommonMessagePropertyId enum определяет хорошо известные идентификаторы свойств MAPI для семантики основных сообщений, полевых элементов, заголовков транспорта и метаданных приложений.

Преобразование между MSG и EML

Рассмотренное сообщение может быть сохранено в любом формате. Save() пишет MSG байты, в то время как SaveToEml() Это делает конвертацию формата простой.

// Load an EML and save as MSG
var message = MapiMessage.LoadFromEml("incoming.eml");
message.Save("converted.msg");

// Load an MSG and save as EML
var msg = MapiMessage.FromFile("outgoing.msg");
msg.SaveToEml("exported.eml");

Оба метода также принимают Stream параметр для обработки в памяти без прикосновения к файловой системе.


Быстрый старт .

Установка пакета из NuGet:

dotnet add package Aspose.Email.FOSS

Тогда проанализируй свое первое сообщение:

using Aspose.Email.Foss.Msg;

// Load an MSG file
var message = MapiMessage.FromFile("sample.msg");

Console.WriteLine($"Subject:     {message.Subject}");
Console.WriteLine($"From:        {message.SenderName} <{message.SenderEmailAddress}>");
Console.WriteLine($"Date:        {message.MessageDeliveryTime}");
Console.WriteLine($"Body length: {message.Body?.Length ?? 0} chars");

// List attachments
foreach (var att in message.Attachments)
    Console.WriteLine($"  Attachment: {att.Filename} ({att.Data.Length} bytes)");

// Convert to EML
message.SaveToEml("sample.eml");
Console.WriteLine("Saved as EML.");

Поддерживаемые форматы

Формат:РасширениеЧитайте .Написать .
Перспектива MSG.msgДа , я знаю .Да , я знаю .
MIME (EML).emlДа , я знаю .Да , я знаю .
Двойной файл соединения.cfbДа , я знаю .Да , я знаю .

Открытый исходный код и лицензирование

Aspose.Email FOSS for .NET is released under the MIT license. The full source code is available on GitHub at Посылка на электронную почту: http://www.e-mail.com/email-foss/Aspose.Email-FOSS-for-.Net.Приглашаем все желающие.


Начинать