Pendahuluan

Aspose.Email FOSS for .NET adalah perpustakaan C# berlisensi MIT, bebas ketergantungan, untuk bekerja dengan
file Outlook MSG, kontainer Compound File Binary (CFB), dan pesan EML. Posting ini menjelajahi
setiap area fitur utama dengan contoh kode yang berfungsi yang diambil langsung dari perpustakaan
suite pengujian — setiap nama kelas dan tanda tangan metode yang ditampilkan di sini diverifikasi terhadap
source repository.

Instal dengan satu perintah — tidak ada Microsoft Outlook, tidak ada interop COM, tidak ada pustaka native:

dotnet add package Aspose.Email.Foss

Fitur Utama

Baca dan Periksa File MSG

MapiMessage.FromStream() dan MapiMessage.FromFile() membuka file Outlook .msg apa pun dan menampilkan seluruh isinya: subjek, isi teks polos, isi HTML, nama pengirim, alamat email pengirim, waktu pengiriman, ID pesan internet, penerima, dan lampiran. Tidak diperlukan instalasi Outlook — seluruh lapisan MSG dan CFB diimplementasikan dalam C# yang dikelola.

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

Buat File MSG dari Awal

MapiMessage.Create() membangun email lengkap di memori. Setel SenderName, SenderEmailAddress, HtmlBody, InternetMessageId, dan MessageDeliveryTime sebagai properti setelah pembuatan, kemudian tambahkan penerima dengan AddRecipient() dan lampiran file atau stream dengan AddAttachment(). Serialisasi dengan message.Save() — mengembalikan sebuah byte[] atau menulis langsung ke jalur atau 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);

Mengonversi EML ke MSG (dan Kembali)

MapiMessage.LoadFromEml() menerima jalur file, sebuah Stream, atau sebuah byte[] yang berisi
pesan standar RFC 5322 / MIME. Parser MIME bawaan mempertahankan subjek, isi teks biasa,
isi HTML, pengirim, penerima, dan semua lampiran — termasuk gambar inline dengan
header Content-ID. SaveToEml() menyerialkan kembali ke MIME untuk perjalanan penuh EML ↔ MSG
tanpa pustaka MIME eksternal.

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

Lampiran Pesan Tertanam

File MSG dapat berisi file MSG lain sebagai lampiran — pola umum dalam rantai email yang diteruskan. AddEmbeddedMessageAttachment() melampirkan objek MapiMessage sebagai lampiran .msg bersarang. Saat membaca, MapiAttachment.IsEmbeddedMessage memberi sinyal tipe yang disematkan dan EmbeddedMessage mengekspos MapiMessage bersarang secara langsung.

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

Membaca dan Menulis Kontainer CFB

File MSG Outlook dibangun di atas format Compound File Binary (CFB) — sebuah kontainer biner hierarkis yang mirip dengan sistem berkas FAT. CfbReader menampilkan seluruh pohon direktori: iterasi storage dan stream dengan IterChildren(), menavigasi ke entri tertentu dengan rantai path menggunakan ResolvePath(), dan membaca byte stream mentah dengan GetStreamData(). CfbWriter.ToBytes() menyerialisasi sebuah CfbDocument menjadi byte — berguna untuk membangun dokumen CFB khusus atau memverifikasi perjalanan bolak‑balik tanpa kehilangan.

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"
}

Akses Properti MAPI Bertipe

MapiPropertyCollection menyediakan akses properti MAPI yang bertipe untuk objek MSG atau penyimpanan apa pun.
The CommonMessagePropertyId enum mencakup semua pengidentifikasi properti MAPI standar — Subject,
Body, BodyHtml, SenderName, SenderEmailAddress, MessageDeliveryTime,
InternetMessageId, dan properti lampiran termasuk AttachFilename, AttachMimeTag,
dan AttachContentId. Gunakan SetProperty() dan GetPropertyValue() untuk membaca dan menulis
properti arbitrer di luar bidang kenyamanan yang dinamai pada 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}");

Panduan Cepat

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

Format yang Didukung

FormatEkstensiBacaTulis
Compound File Binary.cfb
Outlook Message.msg
MIME / EML.eml

Sumber Terbuka & Lisensi

Aspose.Email FOSS untuk .NET dirilis di bawah lisensi MIT. Gunakan secara bebas dalam proyek pribadi, komersial, dan sumber terbuka tanpa batasan penggunaan. Kode sumber tersedia di github.com/aspose-email-foss/Aspose.Email-FOSS-for-.Net.


Memulai