Giới thiệu

Aspose.Email FOSS for .NET là một thư viện C# không phụ thuộc, được cấp phép MIT, dùng để làm việc với
Outlook MSG files, Compound File Binary (CFB) containers, và EML messages. Bài viết này hướng dẫn
qua từng khu vực tính năng chính với các ví dụ mã hoạt động được rút trực tiếp từ bộ kiểm thử của thư viện
test suite — mọi tên lớp và chữ ký phương thức được hiển thị ở đây đều đã được xác minh so với
source repository.

Cài đặt bằng một lệnh duy nhất — không cần Microsoft Outlook, không cần COM interop, không cần thư viện gốc:

dotnet add package Aspose.Email.Foss

Tính năng chính

Đọc và Kiểm tra Tệp MSG

MapiMessage.FromStream()MapiMessage.FromFile() mở bất kỳ tệp Outlook .msg nào và
tiết lộ toàn bộ nội dung của nó: tiêu đề, phần thân dạng văn bản thuần, phần thân HTML, tên người gửi, email người gửi
địa chỉ, thời gian gửi, ID tin nhắn internet, người nhận và tệp đính kèm. Không cần Outlook
cài đặt — toàn bộ lớp MSG và CFB được triển khai bằng C# quản lý.

using System.IO;
using Aspose.Email.Foss.Msg;

using var stream = File.OpenRead("sample.msg");
var message = MapiMessage.FromStream(stream);

Console.WriteLine(message.Subject);
Console.WriteLine(message.SenderEmailAddress);
Console.WriteLine(message.Body);

foreach (var recipient in message.Recipients)
    Console.WriteLine($"To: {recipient.EmailAddress}");

foreach (var attachment in message.Attachments)
    Console.WriteLine($"Attachment: {attachment.Filename} ({attachment.MimeType})");

Tạo tệp MSG từ đầu

MapiMessage.Create() xây dựng một email hoàn chỉnh trong bộ nhớ. Đặt SenderName, SenderEmailAddress, HtmlBody, InternetMessageIdMessageDeliveryTime làm thuộc tính sau khi tạo, sau đó thêm người nhận bằng AddRecipient() và tệp hoặc luồng đính kèm bằng AddAttachment(). Serialize bằng message.Save() — trả về một byte[] hoặc ghi trực tiếp vào một đường dẫn hoặc Stream.

using System.IO;
using Aspose.Email.Foss.Msg;

var message = MapiMessage.Create("Hello", "Body");
message.SenderName = "Alice";
message.SenderEmailAddress = "alice@example.com";
message.HtmlBody = "<p>Body</p>";
message.InternetMessageId = "<hello@example.com>";
message.MessageDeliveryTime = new DateTime(2024, 1, 2, 3, 4, 5, DateTimeKind.Utc);
message.AddRecipient("bob@example.com", "Bob");
message.AddAttachment("note.txt", "abc"u8.ToArray(), "text/plain");

using var output = File.Create("hello.msg");
message.Save(output);

Chuyển đổi EML sang MSG (và Ngược lại)

MapiMessage.LoadFromEml() chấp nhận một đường dẫn tệp, một Stream, hoặc một byte[] chứa một tin nhắn RFC 5322 / MIME chuẩn. Trình phân tích MIME tích hợp bảo tồn tiêu đề, phần thân văn bản thuần, phần thân HTML, người gửi, người nhận và tất cả các tệp đính kèm — bao gồm cả hình ảnh nội tuyến với Content-ID tiêu đề. SaveToEml() tuần tự hoá lại thành MIME để thực hiện vòng quay đầy đủ EML ↔ MSG mà không cần thư viện MIME bên ngoài.

using System.IO;
using Aspose.Email.Foss.Msg;

using var input = File.OpenRead("message.eml");
var message = MapiMessage.LoadFromEml(input);

// Inspect fields parsed from MIME headers
Console.WriteLine(message.Subject);
Console.WriteLine(message.SenderEmailAddress);
Console.WriteLine(message.HtmlBody);

// Save as MSG for Outlook-compatible storage
using var msgOutput = File.Create("message.msg");
message.Save(msgOutput);

// Round-trip back to EML
using var emlOutput = File.Create("roundtrip.eml");
message.SaveToEml(emlOutput);

Tệp đính kèm tin nhắn nhúng

File MSG có thể chứa một file MSG khác dưới dạng tệp đính kèm — một mẫu phổ biến trong chuỗi email được chuyển tiếp. AddEmbeddedMessageAttachment() đính kèm một đối tượng MapiMessage như một tệp đính kèm .msg lồng nhau. Khi đọc, MapiAttachment.IsEmbeddedMessage báo hiệu loại nhúng và EmbeddedMessage trực tiếp hiển thị MapiMessage lồng nhau.

using System.IO;
using Aspose.Email.Foss.Msg;

var parent = MapiMessage.Create("Outer", "Parent body");
var child = MapiMessage.Create("Inner", "Child body");
child.SenderEmailAddress = "inner@example.com";
parent.AddEmbeddedMessageAttachment(child, "inner.msg");

parent.Save("outer.msg");

var loaded = MapiMessage.FromFile("outer.msg");
var attachment = loaded.Attachments[0];

if (attachment.IsEmbeddedMessage)
    Console.WriteLine($"Embedded subject: {attachment.EmbeddedMessage!.Subject}");

Đọc và Ghi Container CFB

Các tệp Outlook MSG được xây dựng trên định dạng Compound File Binary (CFB) — một container nhị phân phân cấp tương tự như hệ thống tập tin FAT. CfbReader hiển thị toàn bộ cây thư mục: lặp qua các storage và stream bằng IterChildren(), điều hướng đến các mục cụ thể bằng chuỗi đường dẫn với ResolvePath(), và đọc byte thô của stream bằng GetStreamData(). CfbWriter.ToBytes() tuần tự hoá một CfbDocument thành byte — hữu ích cho việc xây dựng tài liệu CFB tùy chỉnh hoặc xác minh các vòng quay không mất dữ liệu.

using System.Text;
using Aspose.Email.Foss.Cfb;

// Build a CFB document from scratch
var document = new CfbDocument();
document.Root.AddStream(new CfbStream("ReadMe", Encoding.UTF8.GetBytes("hello")));
var storage = document.Root.AddStorage(new CfbStorage("DataStore"));
storage.AddStream(new CfbStream("Payload", Encoding.UTF8.GetBytes("content")));

byte[] bytes = CfbWriter.ToBytes(document);

// Read it back
using var reader = new CfbReader(bytes);
var entry = reader.ResolvePath(["DataStore", "Payload"]);
if (entry is not null)
{
    var data = reader.GetStreamData(entry.StreamId);
    Console.WriteLine(Encoding.UTF8.GetString(data)); // "content"
}

Truy cập Thuộc tính MAPI Được Đánh kiểu

MapiPropertyCollection cung cấp truy cập thuộc tính MAPI có kiểu cho bất kỳ đối tượng MSG hoặc lưu trữ nào.
The CommonMessagePropertyId enum bao phủ tất cả các định danh thuộc tính MAPI tiêu chuẩn — Subject,
Body, BodyHtml, SenderName, SenderEmailAddress, MessageDeliveryTime,
InternetMessageId, và các thuộc tính đính kèm bao gồm AttachFilename, AttachMimeTag,
AttachContentId. Sử dụng SetProperty()GetPropertyValue() để đọc và ghi
các thuộc tính tùy ý vượt ra ngoài các trường tiện lợi được đặt tên trên MapiMessage.

using Aspose.Email.Foss.Msg;

var message = MapiMessage.FromFile("sample.msg");

// Typed convenience properties
Console.WriteLine(message.Subject);
Console.WriteLine(message.SenderName);
Console.WriteLine(message.MessageDeliveryTime);

// Iterate all MAPI property keys
foreach (var key in message.IterPropertyKeys())
    Console.WriteLine($"0x{(ushort)key.PropertyId:X4} / {key.PropertyType}");

Bắt đầu nhanh

dotnet add package Aspose.Email.Foss
using System.IO;
using Aspose.Email.Foss.Msg;

// Read an MSG file
using var stream = File.OpenRead("sample.msg");
var message = MapiMessage.FromStream(stream);
Console.WriteLine(message.Subject);
Console.WriteLine(message.SenderEmailAddress);
foreach (var recipient in message.Recipients)
    Console.WriteLine($"To: {recipient.EmailAddress}");
foreach (var attachment in message.Attachments)
    Console.WriteLine($"Attachment: {attachment.Filename} ({attachment.MimeType})");

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

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

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

Aspose.Email FOSS for .NET được phát hành dưới giấy phép MIT. Sử dụng nó tự do trong các dự án cá nhân, thương mại và mã nguồn mở mà không có hạn chế nào về việc sử dụng. Mã nguồn có sẵn tại github.com/aspose-email-foss/Aspose.Email-FOSS-for-.Net.


Bắt đầu