Введение
Программное анализирование сообщений электронной почты является обычным требованием для архивных инструментов, трубопроводов соответствия и утилит миграции. Файлы 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.Приглашаем все желающие.
Начинать
- Руководство разработчиков подробная документация и инструкции по работе с ними
- База знаний Часто задаваемые вопросы и статьи с инструкциями по применению
- Ссылка на API полная ссылка на класс и метод