Fitur dan Fungsionalitas

Fitur dan Fungsionalitas

Halaman ini mencakup setiap fitur utama Aspose.Email FOSS for .NET dengan contoh C# yang berfungsi.


Membaca File MSG

Muat file MSG dari jalur atau aliran dan akses semua propertinya:

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

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

Console.WriteLine(message.Subject);
Console.WriteLine(message.Body);
Console.WriteLine(message.HtmlBody);
Console.WriteLine(message.SenderName);
Console.WriteLine(message.SenderEmailAddress);
Console.WriteLine(message.MessageDeliveryTime);
Console.WriteLine(message.InternetMessageId);

Gunakan strict: false untuk parsing yang longgar pada file MSG non‑standar:

var message = MapiMessage.FromFile("message.msg", strict: false);

Periksa ValidationIssues untuk meninjau peringatan format apa pun tanpa melemparkan.

foreach (var issue in message.ValidationIssues)
    Console.WriteLine($"Warning: {issue}");

Membuat File MSG

Bangun email lengkap dengan MapiMessage.Create() dan serialisasikan dengan Save():

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

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

Save() tanpa argumen mengembalikan sebuah byte[]. Save(path) menulis ke jalur file secara langsung.


Penerima

Tambahkan penerima To, Cc, dan Bcc dengan AddRecipient():

message.AddRecipient("alice@example.com", "Alice");
message.AddRecipient("bob@example.com", "Bob", MapiMessage.RecipientTypeCc);
message.AddRecipient("carol@example.com", "Carol", MapiMessage.RecipientTypeBcc);

Iterasi penerima dari pesan yang dimuat:

foreach (var recipient in message.Recipients)
    Console.WriteLine($"{recipient.DisplayName} <{recipient.EmailAddress}>");

Lampiran

Tambahkan lampiran file atau aliran dengan metadata:

// From byte array
message.AddAttachment("report.pdf", pdfBytes, "application/pdf");

// From stream
using var attachStream = File.OpenRead("photo.png");
message.AddAttachment("photo.png", attachStream, "image/png");

// Inline image with Content-ID
message.AddAttachment("logo.png", logoBytes, "image/png", contentId: "logo@cid");

Baca lampiran dari pesan yang dimuat:

foreach (var attachment in message.Attachments)
{
    Console.WriteLine($"Filename: {attachment.Filename}");
    Console.WriteLine($"MIME type: {attachment.MimeType}");
    Console.WriteLine($"Size: {attachment.Data.Length} bytes");
    File.WriteAllBytes(attachment.Filename!, attachment.Data);
}

Lampiran Pesan Tersemat

Lampirkan satu MapiMessage di dalam yang lain — umum dalam rantai email yang diteruskan:

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

Baca lampiran pesan yang disematkan:

var loaded = MapiMessage.FromFile("outer.msg");
foreach (var attachment in loaded.Attachments)
{
    if (attachment.IsEmbeddedMessage)
    {
        Console.WriteLine($"Embedded: {attachment.EmbeddedMessage!.Subject}");
    }
}

Konversi EML dan MIME

Muat file RFC 5322 .eml ke dalam MapiMessage untuk penyimpanan yang kompatibel dengan Outlook:

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

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

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

Konversi kembali ke EML dari file MSG:

var message = MapiMessage.FromFile("message.msg");
using var emlOutput = File.Create("roundtrip.eml");
message.SaveToEml(emlOutput);

LoadFromEml() juga menerima jalur string atau byte[]. SaveToEml() tanpa argumen mengembalikan byte[]. Subjek, isi, isi HTML, pengirim, penerima, dan semua lampiran (termasuk gambar inline dengan Content-ID) dipertahankan melalui perjalanan bolak‑balik penuh EML ↔ MSG.


Akses Properti MAPI

MapiPropertyCollection menyediakan akses bertipe ke properti MAPI melalui SetProperty() dan GetPropertyValue(). Gunakan nilai enum CommonMessagePropertyId untuk properti standar:

using Aspose.Email.Foss.Msg;

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

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

Akses Kontainer CFB

File MSG Outlook dibangun di atas format Compound File Binary (CFB). CfbReader menampilkan seluruh pohon direktori untuk inspeksi dan ekstraksi data:

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

using var reader = CfbReader.FromFile("message.msg");

// Iterate all top-level children
foreach (var entry in reader.IterChildren(CfbConstants.RootStreamId))
    Console.WriteLine($"{(entry.IsStorage() ? "Storage" : "Stream")}: {entry.Name}");

// Navigate to a specific stream by path
var entry2 = reader.ResolvePath(["__substg1.0_0037001E"]);
if (entry2 is not null)
{
    var data = reader.GetStreamData(entry2.StreamId);
    Console.WriteLine(Encoding.Unicode.GetString(data));
}

Bangun dan serialisasikan dokumen CFB dari awal dengan CfbWriter:

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

var document = new CfbDocument();
document.Root.AddStream(new CfbStream("Notes", 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);
File.WriteAllBytes("output.cfb", bytes);

Tips dan Praktik Terbaik

  • Gunakan using atau Dispose() pada MapiMessage dan CfbReader untuk melepaskan pegangan file
  • Periksa message.ValidationIssues setelah memuat untuk mendeteksi format MSG yang tidak standar
  • Parameter strict dalam FromFile() / FromStream() mengontrol toleransi kesalahan — gunakan
    strict: false untuk parsing yang longgar pada file dari sistem pihak ketiga
  • MapiMessage.Create() menghasilkan pesan string Unicode secara default; atur unicodeStrings: false
    untuk kompatibilitas ANSI lama
  • SaveToEml() tanpa argumen mengembalikan byte[] — nyaman untuk alur kerja dalam memori

Masalah Umum

MasalahPenyebabPerbaikan
CfbException saat memuatBukan file CFB/MSG yang validVerifikasi bahwa file tersebut adalah Outlook MSG
Body kosong setelah dimuatBadan disimpan hanya dalam HTMLPeriksa message.HtmlBody sebagai gantinya
Konstanta tipe penerima tidak ditemukanBukan tipe mandiriGunakan MapiMessage.RecipientTypeTo, MapiMessage.RecipientTypeCc, atau MapiMessage.RecipientTypeBcc
0 lampiran setelah LoadFromEmlEML tidak memiliki bagian Content-Disposition: attachmentBagian inline (hanya Content-ID) juga muncul di Attachments

Ringkasan Referensi API

KelasDeskripsi
MapiMessageRepresentasi pesan MSG tingkat tinggi
MapiAttachmentLampiran atau pesan tersemat pada MapiMessage
MapiRecipientPenerima pada MapiMessage
MapiPropertyEntri properti MAPI tunggal
MapiPropertyCollectionKantong properti MAPI bertipe
CommonMessagePropertyIdEnum pengidentifikasi properti MAPI standar
MsgReaderPembaca struktur MSG tingkat rendah
MsgWriterPenulis struktur MSG tingkat rendah
CfbReaderPembaca kontainer biner CFB
CfbWriterPenulis kontainer biner CFB
CfbDocumentDokumen CFB dalam memori untuk konstruksi
CfbStorageNode penyimpanan dalam dokumen CFB
CfbStreamNode aliran dalam dokumen CFB
 Bahasa Indonesia