Функції та можливості

Функції та можливості

Функції та можливості

На цій сторінці розглядаються всі основні функції 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
 Українська