Wprowadzenie

Programowe analizowanie wiadomości e-mail jest powszechnym wymaganiem dla narzędzi archiwizacyjnych, potoków zgodności i narzędzi migracyjnych. Pliki Outlook MSG używają formatu kontenera Compound File Binary (CFB) z strumieniami właściwości MAPI, podczas gdy pliki EML opierają się na standardzie MIME. Oba formaty wymagają starannego obsługi kodowań, składanych nagłówków i zagnieżdżonych załączników.

Aspose.Email FOSS dla .NET to darmowa, na licencji MIT biblioteka C#, która zapewnia pełny interfejs odczytu i zapisu API dla wiadomości MSG i EML. Docelowa wersja .NET 8.0+ i nie ma zależności od Microsoft Outlook ani żadnej natywnej warstwy interfejsu COM. Biblioteka jest dostępna jako pakiet aspose.email.foss NuGet.

Ten wpis przeprowadza przez możliwości parsowania wiadomości zawarte w bibliotece, od wczytywania plików z dysku po wyodrębnianie pojedynczych właściwości MAPI i konwertowanie między formatami.


Co zawiera

Wczytywanie plików MSG

Klasa MapiMessage jest głównym punktem wejścia do pracy z plikami Outlook MSG. Możesz wczytać wiadomość z ścieżki pliku lub strumienia, z opcjonalną flagą ścisłej walidacji, która ujawnia wszelkie problemy strukturalne wykryte w pliku.

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

Zwrócony MapiMessage udostępnia typowane właściwości dla typowych pól, w tym Subject, Body, HtmlBody, SenderName, SenderEmailAddress, InternetMessageId oraz MessageDeliveryTime.

Ładowanie wiadomości EML

Pliki EML używają formatu MIME. MapiMessage.LoadFromEml akceptuje ścieżkę do pliku, Stream lub byte[] i zwraca ten sam obiekt MapiMessage, dzięki czemu używasz jednego ujednoliconego API, niezależnie od formatu źródłowego.

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

Parser obsługuje składane nagłówki, kodowania transferowe Base64 i quoted-printable oraz pola To/Cc z wieloma odbiorcami.

Praca z odbiorcami i załącznikami

Po załadowaniu wiadomości, odbiorcy i załączniki są dostępni jako silnie typowane kolekcje. Każdy MapiRecipient zawiera pola EmailAddress, DisplayName i RecipientType. Każdy MapiAttachment zapewnia Filename, Data, MimeType oraz 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);
}

Załączniki będące wbudowanymi wiadomościami są również obsługiwane. Gdy MapiAttachment.IsEmbeddedMessage jest true, właściwość EmbeddedMessage zwraca zagnieżdżony MapiMessage, który możesz przeglądać rekurencyjnie.

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

W zaawansowanych scenariuszach każdy komunikat, odbiorca i załącznik udostępniają kolekcję Properties typu MapiPropertyCollection. Możesz odczytywać, dodawać i usuwać poszczególne właściwości MAPI według ich identyfikatora właściwości i kodu typu.

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

Wyliczenie CommonMessagePropertyId definiuje znane identyfikatory właściwości MAPI dla podstawowej semantyki wiadomości, pól treści, nagłówków transportowych oraz metadanych załączników.

Konwertowanie między MSG a EML

Przetworzona wiadomość może zostać zapisana ponownie w dowolnym formacie. Save() zapisuje bajty MSG, podczas gdy SaveToEml() generuje wyjście MIME. Dzięki temu konwersja formatów jest prosta.

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

Obie metody przyjmują także parametr Stream umożliwiający przetwarzanie w pamięci bez ingerencji w system plików.


Szybki start

Zainstaluj pakiet z NuGet:

dotnet add package Aspose.Email.FOSS

Następnie przeanalizuj swoją pierwszą wiadomość:

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

Obsługiwane formaty

FormatRozszerzenieOdczytZapis
Outlook MSG.msgTakTak
MIME (EML).emlTakTak
Plik binarny Compound.cfbTakTak

Open Source i licencjonowanie

Aspose.Email FOSS dla .NET jest udostępniony na licencji MIT. Pełny kod źródłowy jest dostępny na GitHub pod adresem aspose-email-foss/Aspose.Email-FOSS-for-.Net. Wkłady, zgłoszenia błędów i pull requesty są mile widziane.


Rozpoczęcie

Powiązane zasoby