Inleiding

Het programmatisch parseren van e-mailberichten is een veelvoorkomende eis voor archiveringsgereedschappen, compliance-pijplijnen en migratietools. Outlook-MSG-bestanden gebruiken het Compound File Binary (CFB) containerformaat met MAPI-eigenschaps-streams, terwijl EML-bestanden de MIME-standaard volgen. Beide formaten vereisen zorgvuldige verwerking van coderingen, gevouwen headers en geneste bijlagen.

Aspose.Email FOSS voor .NET is een gratis, MIT-gelicentieerde C# bibliotheek die een volledige read-write API biedt voor MSG- en EML-berichten. Het richt zich op .NET 8.0+ en heeft geen afhankelijkheid van Microsoft Outlook of een native COM-interoplaag. De bibliotheek is beschikbaar als het aspose.email.foss NuGet pakket.

Dit bericht loopt de bericht-parsingmogelijkheden die in de bibliotheek zijn opgenomen door, van het laden van bestanden van schijf tot het extraheren van individuele MAPI-eigenschappen en het converteren tussen formaten.


Wat er inbegrepen is

MSG-bestanden laden

De MapiMessage-klasse is het primaire toegangspunt voor het werken met Outlook-MSG-bestanden. Je kunt een bericht laden vanaf een bestandspad of een stream, met een optionele strict-validation-vlag die eventuele structurele problemen in het bestand zichtbaar maakt.

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

Het geretourneerde MapiMessage biedt getypeerde eigenschappen voor veelvoorkomende velden, waaronder Subject, Body, HtmlBody, SenderName, SenderEmailAddress, InternetMessageId en MessageDeliveryTime.

EML-berichten laden

EML-bestanden gebruiken het MIME-formaat. MapiMessage.LoadFromEml accepteert een bestandspad, een Stream of een byte[] en retourneert hetzelfde MapiMessage object, zodat je één uniforme API gebruikt, ongeacht het bronformaat.

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

De parser verwerkt gevouwen headers, Base64- en quoted-printable-transfercoderingen, en meerdere ontvangers in To/Cc-velden.

Werken met ontvangers en bijlagen

Zodra een bericht is geladen, zijn ontvangers en bijlagen beschikbaar als sterk getypeerde collecties. Elke MapiRecipient bevat EmailAddress, DisplayName en RecipientType velden. Elke MapiAttachment biedt Filename, Data, MimeType en 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);
}

Ingesloten berichtbijlagen worden ook ondersteund. Wanneer MapiAttachment.IsEmbeddedMessage true is, retourneert de EmbeddedMessage eigenschap een geneste MapiMessage die je recursief kunt inspecteren.

Toegang tot MAPI-eigenschappen

Voor geavanceerde scenario’s stelt elk bericht, elke ontvanger en elke bijlage een Properties collectie van type MapiPropertyCollection beschikbaar. Je kunt individuele MAPI-eigenschappen lezen, toevoegen en verwijderen op basis van hun eigenschaps-ID en typecode.

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

De CommonMessagePropertyId enum definieert bekende MAPI property identifiers voor de kernsemantiek van berichten, body-velden, transport-headers en attachment-metadata.

Converteren tussen MSG en EML

Een geparseerd bericht kan weer worden opgeslagen in elk van de formaten. Save() schrijft MSG-bytes, terwijl SaveToEml() MIME-output genereert. Dit maakt formaatconversie eenvoudig.

// 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 accepteren ook een Stream parameter voor in-memory verwerking zonder het bestandssysteem aan te raken.


Snelstart

Installeer het pakket vanaf NuGet:

dotnet add package Aspose.Email.FOSS

Parse vervolgens uw eerste bericht:

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

Ondersteunde formaten

FormaatExtensieLezenSchrijven
Outlook MSG.msgJaJa
MIME (EML).emlJaJa
Compound File Binary.cfbJaJa

Open source & licenties

Aspose.Email FOSS voor .NET wordt uitgebracht onder de MIT-licentie. De volledige broncode is beschikbaar op GitHub op aspose-email-foss/Aspose.Email-FOSS-for-.Net. Bijdragen, problemen en pull-requests zijn welkom.


Aan de slag

Gerelateerde bronnen