Einleitung
Aspose.Email FOSS for .NET ist eine MIT-lizenzierte, abhängigkeitfreie C#‑Bibliothek zum Arbeiten mit
Outlook‑MSG‑Dateien, Compound‑File‑Binary‑(CFB‑)Containern und EML‑Nachrichten. Dieser Beitrag führt
durch jeden Hauptfunktionsbereich mit funktionierenden Codebeispielen, die direkt aus der Testsuite der Bibliothek entnommen wurden — jeder Klassenname und jede Methodensignatur, die hier gezeigt wird, ist gegen das
source repository verifiziert.
Installation mit einem einzigen Befehl — kein Microsoft Outlook, keine COM‑Interop, keine nativen Bibliotheken:
dotnet add package Aspose.Email.Foss
Hauptmerkmale
MSG-Dateien lesen und inspizieren
MapiMessage.FromStream() und MapiMessage.FromFile() öffnen jede Outlook .msg Datei und
geben deren vollständigen Inhalt wieder: Betreff, Nur-Text-Body, HTML-Body, Absendername, Absender‑E‑Mail
Adresse, Zustellzeit, Internet‑Message‑ID, Empfänger und Anhänge. Keine Outlook
Installation ist erforderlich — die gesamte MSG‑ und CFB‑Schicht ist in verwaltetem C# implementiert.
using System.IO;
using Aspose.Email.Foss.Msg;
using var stream = File.OpenRead("sample.msg");
var message = MapiMessage.FromStream(stream);
Console.WriteLine(message.Subject);
Console.WriteLine(message.SenderEmailAddress);
Console.WriteLine(message.Body);
foreach (var recipient in message.Recipients)
Console.WriteLine($"To: {recipient.EmailAddress}");
foreach (var attachment in message.Attachments)
Console.WriteLine($"Attachment: {attachment.Filename} ({attachment.MimeType})");
MSG-Dateien von Grund auf erstellen
MapiMessage.Create() erstellt eine komplette E‑Mail im Speicher. Setzen Sie SenderName,
SenderEmailAddress, HtmlBody, InternetMessageId und MessageDeliveryTime als
Eigenschaften nach der Erstellung, fügen Sie dann Empfänger mit AddRecipient() und Datei‑ oder Stream‑Anhänge mit AddAttachment() hinzu. Serialisieren Sie mit message.Save() — gibt ein byte[] zurück
oder schreibt direkt in einen Pfad oder Stream.
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");
message.AddAttachment("note.txt", "abc"u8.ToArray(), "text/plain");
using var output = File.Create("hello.msg");
message.Save(output);
EML in MSG konvertieren (und zurück)
MapiMessage.LoadFromEml() akzeptiert einen Dateipfad, ein Stream oder ein byte[], das eine
standard RFC 5322 / MIME-Nachricht enthält. Der integrierte MIME‑Parser bewahrt Betreff, Nur-Text-Body,
HTML-Body, Absender, Empfänger und alle Anhänge — einschließlich eingebetteter Bilder mitContent-ID-Headern. SaveToEml() serialisiert zurück zu MIME für vollständige EML ↔ MSG Rundläufe
ohne externe MIME‑Bibliothek.
using System.IO;
using Aspose.Email.Foss.Msg;
using var input = File.OpenRead("message.eml");
var message = MapiMessage.LoadFromEml(input);
// Inspect fields parsed from MIME headers
Console.WriteLine(message.Subject);
Console.WriteLine(message.SenderEmailAddress);
Console.WriteLine(message.HtmlBody);
// Save as MSG for Outlook-compatible storage
using var msgOutput = File.Create("message.msg");
message.Save(msgOutput);
// Round-trip back to EML
using var emlOutput = File.Create("roundtrip.eml");
message.SaveToEml(emlOutput);
Eingebettete Nachrichtenanhänge
Eine MSG-Datei kann eine weitere MSG-Datei als Anhang enthalten — ein häufiges Muster in weitergeleiteten E‑Mail‑Ketten. AddEmbeddedMessageAttachment() fügt ein MapiMessage‑Objekt als verschachtelten .msg‑Anhang hinzu. Beim Lesen signalisiert MapiAttachment.IsEmbeddedMessage den eingebetteten Typ und EmbeddedMessage stellt den verschachtelten MapiMessage direkt bereit.
using System.IO;
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");
var attachment = loaded.Attachments[0];
if (attachment.IsEmbeddedMessage)
Console.WriteLine($"Embedded subject: {attachment.EmbeddedMessage!.Subject}");
CFB-Container lesen und schreiben
Outlook‑MSG‑Dateien basieren auf dem Compound File Binary (CFB)‑Format — einem hierarchischen binären Container, der einem FAT‑Dateisystem ähnelt. CfbReader stellt den vollständigen Verzeichnisbaum bereit: Durchlaufen von Storages und Streams mit IterChildren(), Navigieren zu bestimmten Einträgen über eine Pfadkette mit ResolvePath() und Lesen von rohen Stream‑Bytes mit GetStreamData(). CfbWriter.ToBytes() serialisiert ein CfbDocument in Bytes — nützlich zum Erstellen benutzerdefinierter CFB‑Dokumente oder zum Verifizieren verlustfreier Rundreisen.
using System.Text;
using Aspose.Email.Foss.Cfb;
// Build a CFB document from scratch
var document = new CfbDocument();
document.Root.AddStream(new CfbStream("ReadMe", 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);
// Read it back
using var reader = new CfbReader(bytes);
var entry = reader.ResolvePath(["DataStore", "Payload"]);
if (entry is not null)
{
var data = reader.GetStreamData(entry.StreamId);
Console.WriteLine(Encoding.UTF8.GetString(data)); // "content"
}
Typisierte MAPI-Eigenschaftszugriff
MapiPropertyCollection bietet typisierten MAPI‑Eigenschaftszugriff für jedes MSG‑ oder Speicherobjekt.
Das CommonMessagePropertyId‑Enum deckt alle Standard‑MAPI‑Eigenschaftskennungen ab — Subject,Body, BodyHtml, SenderName, SenderEmailAddress, MessageDeliveryTime,InternetMessageId sowie Anhangseigenschaften einschließlich AttachFilename, AttachMimeTag,
und AttachContentId. Verwenden Sie SetProperty() und GetPropertyValue(), um beliebige Eigenschaften
jenseits der benannten Komfortfelder auf MapiMessage zu lesen und zu schreiben.
using Aspose.Email.Foss.Msg;
var message = MapiMessage.FromFile("sample.msg");
// Typed 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}");
Schnellstart
dotnet add package Aspose.Email.Foss
using System.IO;
using Aspose.Email.Foss.Msg;
// Read an MSG file
using var stream = File.OpenRead("sample.msg");
var message = MapiMessage.FromStream(stream);
Console.WriteLine(message.Subject);
Console.WriteLine(message.SenderEmailAddress);
foreach (var recipient in message.Recipients)
Console.WriteLine($"To: {recipient.EmailAddress}");
foreach (var attachment in message.Attachments)
Console.WriteLine($"Attachment: {attachment.Filename} ({attachment.MimeType})");
Unterstützte Formate
| Format | Erweiterung | Lesen | Schreiben |
|---|---|---|---|
| Compound File Binary | .cfb | ✓ | ✓ |
| Outlook Message | .msg | ✓ | ✓ |
| MIME / EML | .eml | ✓ | ✓ |
Open Source & Lizenzierung
Aspose.Email FOSS für .NET wird unter der MIT-Lizenz veröffentlicht. Verwenden Sie es frei in privaten,
kommerziellen und Open-Source-Projekten ohne Nutzungsbeschränkungen. Der Quellcode ist verfügbar unter
github.com/aspose-email-foss/Aspose.Email-FOSS-for-.Net.