Funkcje i funkcjonalności

Funkcje i możliwości

Ta strona opisuje wszystkie główne funkcje Aspose.Email FOSS for .NET z działającymi przykładami w C#.


Odczytywanie plików MSG

Wczytaj plik MSG z ścieżki lub strumienia i uzyskaj dostęp do wszystkich jego właściwości:

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);

Użyj strict: false do łagodnego parsowania niestandardowych plików MSG:

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

Sprawdź ValidationIssues, aby przejrzeć wszelkie ostrzeżenia formatowe bez wyrzucania:

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

Tworzenie plików MSG

Zbuduj kompletną wiadomość e‑mail przy użyciu MapiMessage.Create() i serializuj przy użyciu 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() bez argumentów zwraca byte[]. Save(path) zapisuje bezpośrednio do ścieżki pliku.


Odbiorcy

Dodaj odbiorców To, Cc i Bcc z AddRecipient():

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

Iteruj odbiorców z wczytanej wiadomości:

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

Załączniki

Dodaj załączniki plików lub strumieni z metadanymi:

// 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");

Odczytaj załączniki z wczytanej wiadomości:

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);
}

Załączniki wiadomości osadzonej

Dołącz jeden MapiMessage wewnątrz drugiego — typowe w łańcuchach przekazywanych e‑maili:

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");

Przeczytaj wbudowane załączniki wiadomości:

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

Konwersja EML i MIME

Załaduj plik RFC 5322 .eml do MapiMessage w celu przechowywania zgodnego z Outlookiem:

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);

Konwertuj z powrotem do EML z pliku MSG:

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

LoadFromEml() akceptuje również ścieżkę string lub byte[]. SaveToEml() bez argumentów zwraca byte[]. Temat, treść, treść HTML, nadawca, odbiorcy oraz wszystkie załączniki (w tym obrazy wbudowane przy użyciu Content-ID) są zachowywane przy pełnych wymianach EML ↔ MSG.


Dostęp do właściwości MAPI

MapiPropertyCollection zapewnia typowy dostęp do właściwości MAPI za pośrednictwem SetProperty() i GetPropertyValue(). Użyj wartości wyliczenia CommonMessagePropertyId dla standardowych właściwości:

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}");

Dostęp do kontenera CFB

Pliki Outlook MSG są zbudowane w formacie Compound File Binary (CFB). CfbReader udostępnia pełne drzewo katalogów do przeglądu i wyodrębniania danych:

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));
}

Utwórz i serializuj dokument CFB od podstaw przy użyciu 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);

Wskazówki i najlepsze praktyki

  • Użyj using lub Dispose() na MapiMessage i CfbReader, aby zwolnić uchwyty plików
  • Sprawdź message.ValidationIssues po załadowaniu, aby wykryć niestandardowe formatowanie MSG
  • Parametr strict w FromFile() / FromStream() kontroluje tolerancję błędów — użyj strict: false do łagodnego parsowania plików z systemów zewnętrznych
  • MapiMessage.Create() generuje komunikaty jako ciągi Unicode domyślnie; ustaw unicodeStrings: false dla zgodności z legacy ANSI
  • SaveToEml() bez argumentów zwraca byte[] — wygodne w przepływach pracy w pamięci

Typowe problemy

ProblemPrzyczynaRozwiązanie
CfbException podczas ładowaniaNieprawidłowy plik CFB/MSGSprawdź, czy plik jest Outlook MSG
Pusty Body po załadowaniuTreść przechowywana tylko w HTMLSprawdź message.HtmlBody zamiast tego
0 załączników po LoadFromEmlEML nie ma części Content-Disposition: attachmentCzęści inline (tylko Content-ID) również pojawiają się w Attachments

Podsumowanie odniesienia API

ClassDescription
MapiMessageWysokopoziomowa reprezentacja wiadomości MSG
MapiAttachmentZałącznik lub osadzona wiadomość w MapiMessage
MapiRecipientOdbiorca w MapiMessage
MapiPropertyPojedynczy wpis właściwości MAPI
MapiPropertyCollectionZbiór typowanych właściwości MAPI
CommonMessagePropertyIdWyliczenie standardowych identyfikatorów właściwości MAPI
MsgReaderNiskopoziomowy czytnik struktury MSG
MsgWriterNiskopoziomowy zapis struktury MSG
CfbReaderCzytnik binarnego kontenera CFB
CfbWriterZapis binarnego kontenera CFB
CfbDocumentDokument CFB w pamięci do konstrukcji
CfbStorageWęzeł przechowywania w dokumencie CFB
CfbStreamWęzeł strumienia w dokumencie CFB
 Polski