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.FOSSNastę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
| Format | Rozszerzenie | Odczyt | Zapis |
|---|---|---|---|
| Outlook MSG | .msg | Tak | Tak |
| MIME (EML) | .eml | Tak | Tak |
| Plik binarny Compound | .cfb | Tak | Tak |
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
- Developer Guide — szczegółowa dokumentacja i przewodniki
- Knowledge Base — FAQ i artykuły instruktażowe
- API Reference — pełna referencja klas i metod