Функции и возможности

Функции и возможности

Эта страница охватывает все основные функции Aspose.Email FOSS for .NET с работающими примерами на C#.


Чтение файлов MSG

Загрузите файл MSG из пути или потока и получите доступ ко всем его свойствам:

using System.IO;
using Aspose.Email.Foss.Msg;

using var stream = File.OpenRead("message.msg");
var message = MapiMessage.FromStream(stream);

Console.WriteLine(message.Subject);
Console.WriteLine(message.Body);
Console.WriteLine(message.HtmlBody);
Console.WriteLine(message.SenderName);
Console.WriteLine(message.SenderEmailAddress);
Console.WriteLine(message.MessageDeliveryTime);
Console.WriteLine(message.InternetMessageId);

Используйте strict: false для мягкого разбора нестандартных файлов MSG:

var message = MapiMessage.FromFile("message.msg", strict: false);

Проверьте ValidationIssues, чтобы просмотреть любые предупреждения о формате без выбрасывания.

foreach (var issue in message.ValidationIssues)
    Console.WriteLine($"Warning: {issue}");

Создание MSG файлов

Создайте полное электронное письмо с MapiMessage.Create() и сериализуйте с помощью Save():

using System.IO;
using Aspose.Email.Foss.Msg;

var message = MapiMessage.Create("Hello", "Body");
message.SenderName = "Alice";
message.SenderEmailAddress = "alice@example.com";
message.HtmlBody = "<p>Body</p>";
message.InternetMessageId = "<hello@example.com>";
message.MessageDeliveryTime = new DateTime(2024, 1, 2, 3, 4, 5, DateTimeKind.Utc);

message.AddRecipient("bob@example.com", "Bob");

using var output = File.Create("hello.msg");
message.Save(output);

Save() без аргументов возвращает byte[]. Save(path) записывает непосредственно в путь файла.


Получатели

Добавьте получателей To, Cc и Bcc с AddRecipient():

message.AddRecipient("alice@example.com", "Alice");
message.AddRecipient("bob@example.com", "Bob", MapiMessage.RecipientTypeCc);
message.AddRecipient("carol@example.com", "Carol", MapiMessage.RecipientTypeBcc);

Перебрать получателей из загруженного сообщения:

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

Вложения

Добавьте вложения файлов или потоков с метаданными:

// From byte array
message.AddAttachment("report.pdf", pdfBytes, "application/pdf");

// From stream
using var attachStream = File.OpenRead("photo.png");
message.AddAttachment("photo.png", attachStream, "image/png");

// Inline image with Content-ID
message.AddAttachment("logo.png", logoBytes, "image/png", contentId: "logo@cid");

Прочитать вложения из загруженного сообщения:

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

Вложения встроенных сообщений

Прикрепить один MapiMessage внутри другого — часто встречается в цепочках пересылаемых писем:

using Aspose.Email.Foss.Msg;

var parent = MapiMessage.Create("Outer", "Parent body");
var child = MapiMessage.Create("Inner", "Child body");
child.SenderEmailAddress = "inner@example.com";
parent.AddEmbeddedMessageAttachment(child, "inner.msg");

parent.Save("outer.msg");

Нет вложений для перевода.

var loaded = MapiMessage.FromFile("outer.msg");
foreach (var attachment in loaded.Attachments)
{
    if (attachment.IsEmbeddedMessage)
    {
        Console.WriteLine($"Embedded: {attachment.EmbeddedMessage!.Subject}");
    }
}

Преобразование EML и MIME

Загрузите файл RFC 5322 .eml в MapiMessage для совместимого с Outlook хранения:

using System.IO;
using Aspose.Email.Foss.Msg;

using var input = File.OpenRead("message.eml");
var message = MapiMessage.LoadFromEml(input);

using var msgOutput = File.Create("message.msg");
message.Save(msgOutput);

Преобразовать обратно в EML из файла MSG:

var message = MapiMessage.FromFile("message.msg");
using var emlOutput = File.Create("roundtrip.eml");
message.SaveToEml(emlOutput);

LoadFromEml() также принимает путь string или byte[]. SaveToEml() без аргументов возвращает byte[]. Тема, тело, HTML‑тело, отправитель, получатели и все вложения (включая встроенные изображения с Content-ID) сохраняются при полном преобразовании EML ↔ MSG.


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

MapiPropertyCollection обеспечивает типизированный доступ к свойствам MAPI через SetProperty() и GetPropertyValue(). Используйте значения перечисления CommonMessagePropertyId для стандартных свойств:

using Aspose.Email.Foss.Msg;

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

// Named convenience properties
Console.WriteLine(message.Subject);
Console.WriteLine(message.SenderName);
Console.WriteLine(message.MessageDeliveryTime);

// Iterate all MAPI property keys
foreach (var key in message.IterPropertyKeys())
    Console.WriteLine($"0x{(ushort)key.PropertyId:X4} / {key.PropertyType}");

CFB Доступ к контейнеру

Файлы Outlook MSG построены на основе формата Compound File Binary (CFB). CfbReader предоставляет полный каталог дерева для инспекции и извлечения данных:

using System.Text;
using Aspose.Email.Foss.Cfb;

using var reader = CfbReader.FromFile("message.msg");

// Iterate all top-level children
foreach (var entry in reader.IterChildren(CfbConstants.RootStreamId))
    Console.WriteLine($"{(entry.IsStorage() ? "Storage" : "Stream")}: {entry.Name}");

// Navigate to a specific stream by path
var entry2 = reader.ResolvePath(["__substg1.0_0037001E"]);
if (entry2 is not null)
{
    var data = reader.GetStreamData(entry2.StreamId);
    Console.WriteLine(Encoding.Unicode.GetString(data));
}

Создайте и сериализуйте документ CFB с нуля с помощью CfbWriter:

using System.Text;
using Aspose.Email.Foss.Cfb;

var document = new CfbDocument();
document.Root.AddStream(new CfbStream("Notes", Encoding.UTF8.GetBytes("hello")));
var storage = document.Root.AddStorage(new CfbStorage("DataStore"));
storage.AddStream(new CfbStream("Payload", Encoding.UTF8.GetBytes("content")));

byte[] bytes = CfbWriter.ToBytes(document);
File.WriteAllBytes("output.cfb", bytes);

Советы и лучшие практики

  • Используйте using или Dispose() на MapiMessage и CfbReader для освобождения файловых дескрипторов
  • Проверьте message.ValidationIssues после загрузки, чтобы обнаружить нестандартное форматирование MSG
  • Параметр strict в FromFile() / FromStream() управляет допуском ошибок — используйте strict: false для более мягкого разбора файлов из сторонних систем
  • MapiMessage.Create() по умолчанию генерирует сообщения в виде Unicode-строк; установите unicodeStrings: false для совместимости с устаревшим ANSI
  • SaveToEml() без аргументов возвращает byte[] — удобно для потоков работы в памяти

Распространённые проблемы

ПроблемаПричинаРешение
CfbException при загрузкеНедействительный файл CFB/MSGУбедитесь, что файл является Outlook MSG
Пустой Body после загрузкиТело сообщения хранится только в HTMLПроверьте message.HtmlBody вместо этого
Константа типа получателя не найденаНе отдельный типИспользуйте MapiMessage.RecipientTypeTo, MapiMessage.RecipientTypeCc или MapiMessage.RecipientTypeBcc
0 вложений после LoadFromEmlEML не содержит частей Content-Disposition: attachmentВстроенные части (только Content-ID) также появляются в Attachments

Сводка справочного руководства API

ClassDescription
MapiMessageПредставление сообщения MSG высокого уровня
MapiAttachmentВложение или встроенное сообщение в MapiMessage
MapiRecipientПолучатель в MapiMessage
MapiPropertyОтдельный элемент свойства MAPI
MapiPropertyCollectionТипизированный контейнер свойств MAPI
CommonMessagePropertyIdПеречисление стандартных идентификаторов свойств MAPI
MsgReaderЧитатель структуры MSG низкого уровня
MsgWriterЗаписыватель структуры MSG низкого уровня
CfbReaderЧитатель бинарного контейнера CFB
CfbWriterЗаписыватель бинарного контейнера CFB
CfbDocumentДокумент CFB в памяти для построения
CfbStorageУзел хранилища в документе CFB
CfbStreamУзел потока в документе CFB
 Русский