Introduktion
Att programatiskt analysera e-postmeddelanden är ett vanligt krav för arkiveringsverktyg, efterlevnadspipelines och migrationsverktyg. Outlook-MSG-filer använder Compound File Binary (CFB)-behållarformatet med MAPI-egenskapsströmmar, medan EML-filer följer MIME-standarden. Båda formaten kräver noggrann hantering av kodningar, vikta rubriker och nästlade bilagor.
Aspose.Email FOSS för .NET är ett gratis, MIT-licensierat C#-bibliotek som tillhandahåller en komplett läs-skriv API för MSG- och EML-meddelanden. Det riktar sig mot .NET 8.0+ och har inget beroende av Microsoft Outlook eller något inbyggt COM-interop-lager. Biblioteket finns tillgängligt som paketet aspose.email.foss NuGet.
Detta inlägg går igenom meddelande-parsningsfunktionerna som ingår i biblioteket, från att läsa in filer från disk till att extrahera enskilda MAPI-egenskaper och konvertera mellan format.
Vad som ingår
Laddar MSG-filer
MapiMessage-klassen är den primära ingångspunkten för att arbeta med Outlook-MSG-filer. Du kan läsa in ett meddelande från en filsökväg eller en ström, med en valfri strict-validation-flagga som visar eventuella strukturella problem som finns i filen.
// 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}");
Den returnerade MapiMessage exponerar typade egenskaper för vanliga fält inklusive Subject, Body, HtmlBody, SenderName, SenderEmailAddress, InternetMessageId och MessageDeliveryTime.
Laddar EML-meddelanden
EML-filer använder MIME-formatet. MapiMessage.LoadFromEml accepterar en filsökväg, en Stream eller en byte[] och returnerar samma MapiMessage-objekt, så du använder en enhetlig API oavsett källformatet.
// 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()}");
Parsern hanterar hopviktade rubriker, Base64- och quoted-printable-överföringskodningar samt fält för flera mottagare i Till/Kopia.
Arbeta med mottagare och bilagor
När ett meddelande har laddats är mottagare och bilagor tillgängliga som starkt typade samlingar. Varje MapiRecipient innehåller fälten EmailAddress, DisplayName och RecipientType. Varje MapiAttachment tillhandahåller Filename, Data, MimeType och 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);
}
Inbäddade meddelandebilagor stöds också. När MapiAttachment.IsEmbeddedMessage är true returnerar EmbeddedMessage-egenskapen en nästlad MapiMessage som du kan inspektera rekursivt.
Åtkomst till MAPI-egenskaper
För avancerade scenarier exponeras varje meddelande, mottagare och bilaga en Properties samling av typen MapiPropertyCollection. Du kan läsa, lägga till och ta bort enskilda MAPI-egenskaper efter deras egenskaps-ID och typkod.
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);
Enumen CommonMessagePropertyId definierar välkända MAPI-egenskapsidentifierare för grundläggande meddelandesemantik, brödtextfält, transporthuvuden och bilagmetadata.
Konvertera mellan MSG och EML
Ett analyserat meddelande kan sparas tillbaka i antingen format. Save() skriver MSG-bytes, medan SaveToEml() producerar MIME-utdata. Detta gör formatkonvertering enkel.
// 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");
Båda metoderna accepterar också en Stream-parameter för minnesbaserad bearbetning utan att röra filsystemet.
Snabbstart
Installera paketet från NuGet:
dotnet add package Aspose.Email.FOSSAnalysera sedan ditt första meddelande:
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.");
Stödda format
| Format | Filändelse | Läs | Skriv |
|---|---|---|---|
| Outlook MSG | .msg | Ja | Ja |
| MIME (EML) | .eml | Ja | Ja |
| Compound File Binary | .cfb | Ja | Ja |
Öppen källkod & licensiering
Aspose.Email FOSS för .NET är släppt under MIT-licensen. Den fullständiga källkoden finns tillgänglig på GitHub på aspose-email-foss/Aspose.Email-FOSS-for-.Net. Bidrag, problem och pull-requests är välkomna.
Komma igång
- Developer Guide — detaljerad dokumentation och genomgångar
- Knowledge Base — Vanliga frågor och hur-gör-du-det-artiklar
- API Reference — fullständig klass- och metodreferens