Einführung

Das programmatische Parsen von E-Mail-Nachrichten ist eine häufige Anforderung für Archivierungswerkzeuge, Compliance Pipelines und Migrations-Dienste. Outlook MSG-Dateien verwenden das Containerformat Compound File Binary (CFB) mit MAPI-Eigenschaftsströmen, während EML-File dem MIME-Standard folgen. Beide Formate erfordern einen sorgfältigen Umgang mit Kodierungen, gefalteten Headern und verschachtelten Anhängen.

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 Das Paket ist aus NuGet.

Dieser Beitrag führt die in der Bibliothek enthaltenen Nachrichten-Parsing-Funktionen durch, vom Laden von Dateien auf Festplatte bis hin zum Extraktion einzelner MAPI-Eigenschaften und Konvertieren zwischen Formaten.


Was ist darin enthalten?

MSG-Dateien laden

Die MapiMessage Sie können eine Nachricht von einem Dateipfad oder einem Stream mit einer optionalen Strengevalidierung Flag, die alle strukturellen Probleme in der Datei auftaucht laden.

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

Die zurückgekehrten MapiMessage Typisierte Eigenschaften für gemeinsame Felder, einschließlich: Subject, Body, HtmlBody, SenderName, SenderEmailAddress, InternetMessageId,und . MessageDeliveryTime.

E-Mail Nachrichten laden

EML-Dateien verwenden das MIME-Format. MapiMessage.LoadFromEml Akzeptiert einen Dateipfad, a Stream,oder a) byte[] und gibt die gleiche zurück. MapiMessage Objekt, so dass Sie eine einheitliche API unabhängig vom Quellformat verwenden.

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

Der Parser behandelt gefaltete Header, Base64 und zitierte druckbare Transfer-Codierungen sowie To/Cc-Felder mit mehreren Empfängern.

Zusammenarbeit mit Empfängern und Anhängen

Nach dem Laden der Nachricht sind Empfänger und Anhänge als stark eingetypte Sammlungen verfügbar. MapiRecipient Tragen EmailAddress, DisplayName,und . RecipientType Jedes Feld. MapiAttachment stellt vor, Filename, Data, MimeType,und . 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);
}

Auch eingebettete Nachrichtenanlagen werden unterstützt. MapiAttachment.IsEmbeddedMessage ist . true, die EmbeddedMessage Eigenschaft gibt einen verschachtelten MapiMessage Sie können rekursiv überprüfen.

Zugriff auf MAPI-Eigenschaften

Für fortgeschrittene Szenarien, jede Nachricht, Empfänger und Anhang zeigt eine Properties Sammlung der Art MapiPropertyCollection.Sie können einzelne MAPI-Eigenschaften nach deren Eigentums-ID und Typcode lesen, hinzufügen und entfernen.

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

Die CommonMessagePropertyId enum definiert bekannte MAPI-Eigenschaftskennungen für Kernnachrichtensemantik, Körperfelder, Transportüberschriften und Anlagemetadaten.

Umwandlung zwischen MSG und EML

Eine analysierte Nachricht kann in beiden Formaten gespeichert werden. Save() Schreibt MSG-Bytes, während SaveToEml() Erzeugt MIME-Ausgabe. Dies macht die Formatkonvertierung unkompliziert.

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

Beide Methoden akzeptieren auch eine Stream Parameter für die In-Memory-Verarbeitung ohne das Dateisystem zu berühren.


Schneller Start

Installieren Sie das Paket von NuGet:

dotnet add package Aspose.Email.FOSS

Dann analysieren Sie Ihre erste Nachricht:

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

Unterstützte Formate

Format der DatenbankErweiterungLesen Sie .Schreiben .
Ausblick MSG.msg- Ja , das ist gut .- Ja , das ist gut .
MIME (EML).eml- Ja , das ist gut .- Ja , das ist gut .
Binäre Datei mit Kompound-Dateien.cfb- Ja , das ist gut .- Ja , das ist gut .

Open Source und Lizenzierung

Aspose.Email FOSS for .NET is released under the MIT license. The full source code is available on GitHub at Die Daten werden in der Liste “E-Mail” angegeben..Beiträge, Fragen und Wünsche sind willkommen.


Wie man anfängt