Giới thiệu

Phân tích tin nhắn email một cách lập trình là một yêu cầu phổ biến cho các công cụ lưu trữ, quy trình tuân thủ và tiện ích di chuyển. Các tệp Outlook MSG sử dụng định dạng container Compound File Binary (CFB) với các luồng thuộc tính MAPI, trong khi các tệp EML tuân theo tiêu chuẩn MIME. Cả hai định dạng đều yêu cầu xử lý cẩn thận các mã hoá, tiêu đề gập, và các tệp đính kèm lồng nhau.

Aspose.Email FOSS cho .NET là một thư viện C# miễn phí, được cấp phép MIT, cung cấp một API đọc-ghi đầy đủ cho các tin nhắn MSG và EML. Nó nhắm mục tiêu .NET 8.0+ và không phụ thuộc vào Microsoft Outlook hay bất kỳ lớp giao tiếp COM gốc nào. Thư viện này có sẵn dưới dạng gói aspose.email.foss NuGet.

Bài viết này sẽ hướng dẫn qua các khả năng phân tích tin nhắn được tích hợp trong thư viện, từ việc tải tệp từ đĩa đến việc trích xuất các thuộc tính MAPI riêng lẻ và chuyển đổi giữa các định dạng.


Những gì được bao gồm

Tải các tệp MSG

Lớp MapiMessage là điểm vào chính để làm việc với các tệp Outlook MSG. Bạn có thể tải một tin nhắn từ đường dẫn tệp hoặc một luồng, với tùy chọn cờ strict-validation giúp hiển thị bất kỳ vấn đề cấu trúc nào được phát hiện trong tệp.

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

Đối tượng MapiMessage trả về cung cấp các thuộc tính có kiểu cho các trường phổ biến bao gồm Subject, Body, HtmlBody, SenderName, SenderEmailAddress, InternetMessageIdMessageDeliveryTime.

Đang tải tin nhắn EML

Các tệp EML sử dụng định dạng MIME. MapiMessage.LoadFromEml chấp nhận một đường dẫn tệp, một Stream, hoặc một byte[] và trả về cùng một đối tượng MapiMessage, vì vậy bạn sử dụng một API thống nhất bất kể định dạng nguồn.

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

Trình phân tích xử lý các tiêu đề gập lại, các mã hoá chuyển tải Base64 và quoted-printable, và các trường To/Cc đa người nhận.

Làm việc với người nhận và tệp đính kèm

Khi một tin nhắn đã được tải, người nhận và tệp đính kèm có sẵn dưới dạng các tập hợp có kiểu chặt chẽ. Mỗi MapiRecipient chứa các trường EmailAddress, DisplayNameRecipientType. Mỗi MapiAttachment cung cấp các trường Filename, Data, MimeTypeContentId.

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

Các tệp đính kèm tin nhắn nhúng cũng được hỗ trợ. Khi MapiAttachment.IsEmbeddedMessagetrue, thuộc tính EmbeddedMessage trả về một MapiMessage lồng nhau mà bạn có thể kiểm tra một cách đệ quy.

Truy cập các thuộc tính MAPI

Đối với các kịch bản nâng cao, mỗi tin nhắn, người nhận và tệp đính kèm đều cung cấp một bộ sưu tập Properties có kiểu MapiPropertyCollection. Bạn có thể đọc, thêm và xóa các thuộc tính MAPI riêng lẻ bằng ID thuộc tính và mã loại của chúng.

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

Enum CommonMessagePropertyId xác định các định danh thuộc tính MAPI đã biết cho ngữ nghĩa cốt lõi của tin nhắn, các trường nội dung, tiêu đề truyền tải và siêu dữ liệu tệp đính kèm.

Chuyển đổi giữa MSG và EML

Một tin nhắn đã phân tích có thể được lưu lại dưới bất kỳ định dạng nào. Save() ghi các byte MSG, trong khi SaveToEml() tạo ra đầu ra MIME. Điều này làm cho việc chuyển đổi định dạng trở nên đơn giản.

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

Cả hai phương pháp cũng chấp nhận một tham số Stream để xử lý trong bộ nhớ mà không cần truy cập hệ thống tệp.


Bắt đầu nhanh

Cài đặt gói từ NuGet:

dotnet add package Aspose.Email.FOSS

Sau đó, phân tích tin nhắn đầu tiên của bạn:

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

Định dạng được hỗ trợ

Định dạngPhần mở rộngĐọcGhi
Outlook MSG.msg
MIME (EML).eml
Compound File Binary.cfb

Mã nguồn mở & Giấy phép

Aspose.Email FOSS cho .NET được phát hành dưới giấy phép MIT. Mã nguồn đầy đủ có sẵn trên GitHub tại aspose-email-foss/Aspose.Email-FOSS-for-.Net. Các đóng góp, vấn đề và yêu cầu kéo đều được chào đón.


Bắt đầu

Tài nguyên liên quan