การเขียนโปรแกรมด้วย Thunderbird

การอ่านไฟล์ MBOX

Mozilla Thunderbird เป็นไคลเอนต์อีเมลแบบโอเพ่นซอร์สที่ทำงานข้ามแพลตฟอร์ม พัฒนาโดย Mozilla Foundation มันเก็บอีเมลในโครงสร้างไฟล์ของตนเอง จัดการดัชนีข้อความและโฟลเดอร์ย่อยผ่านรูปแบบไฟล์เฉพาะกรรมสิทธิ์ Aspose.Email สามารถทำงานกับโครงสร้างการเก็บเมลของ Thunderbird ได้. MboxrdStorageReader คลาสนี้ทำให้นักพัฒนาสามารถอ่านข้อความจากไฟล์ที่เก็บเมลของ Mozilla Thunderbird ได้ บทความนี้แสดงวิธีอ่านข้อความจากที่เก็บอีเมลของ Thunderbird:

  1. เปิดไฟล์ที่เก็บของ Thunderbird ใน FileStream.
  2. สร้างอินสแตนซ์ของ MboxrdStorageReader คลาสและส่งสตรีมที่กล่าวถึงข้างต้นไปยังคอนสตรัคเตอร์.
  3. เรียก ReadNextMessage() เพื่อรับข้อความแรก.
  4. ใช้แบบเดียวกัน ReadNextMessage() ในลูป while เพื่ออ่านข้อความทั้งหมด.
  5. ปิดสตรีมทั้งหมด.

โค้ดตัวอย่างต่อไปนี้แสดงวิธีอ่านข้อความทั้งหมดจากที่เก็บเมลของ Thunderbird.

// The path to the File directory.
var dataDir = RunExamples.GetDataDir_Thunderbird();

// Open the storage file with FileStream
var stream = new FileStream(dataDir + "ExampleMbox.mbox", FileMode.Open, FileAccess.Read);
// Create an instance of the MboxrdStorageReader class and pass the stream
var reader = new MboxrdStorageReader(stream, false);
// Start reading messages
var message = reader.ReadNextMessage();

// Read all messages in a loop
while (message != null)
{
    // Manipulate message - show contents
    Console.WriteLine("Subject: " + message.Subject);
    // Save this message in EML or MSG format
    message.Save(message.Subject + ".eml", SaveOptions.DefaultEml);
    message.Save(message.Subject + ".msg", SaveOptions.DefaultMsgUnicode);

    // Get the next message
    message = reader.ReadNextMessage();
}

// Close the streams
reader.Dispose();
stream.Close();

การเรียกคืนคุณสมบัติของข้อความ

MboxMessageInfo คลาสนี้มีคุณสมบัติดังต่อไปนี้เพื่อดึงข้อมูลเกี่ยวกับข้อความ:

  • DateTime Date - รับวันที่ของข้อความ
  • MailAddress From - รับที่อยู่อีเมลผู้ส่ง
  • string Subject - รับหัวข้อของข้อความ
  • MailAddressCollection ถึง - รับคอลเลกชันที่อยู่ของผู้รับข้อความ
  • MailAddressCollection CC - รับคอลเลกชันที่อยู่ที่ประกอบด้วยผู้รับ CC
  • MailAddressCollection Bcc - รับคอลเลกชันที่อยู่ที่ประกอบด้วยผู้รับ BCC ของข้อความ
MboxStorageReader reader = MboxStorageReader.CreateReader(fileName, new MboxLoadOptions());

foreach (var mboxMessageInfo in reader.EnumerateMessageInfo())
{
    Console.Writeline($"Subject: {mboxMessageInfo.Subject}");
    Console.Writeline($"Date: {mboxMessageInfo.Date}");
    Console.Writeline($"From: {mboxMessageInfo.From}");
    Console.Writeline($"To: {mboxMessageInfo.To}");
    Console.Writeline($"CC: {mboxMessageInfo.CC}");
    Console.Writeline($"Bcc: {mboxMessageInfo.Bcc}");
}

สกัดข้อความจาก MBOX ตามรหัสประจำตัว

นี้ MboxStorageReader คลาสนี้รวมถึง EnumerateMessageInfo() เมธอด ซึ่งทำให้คุณสามารถวนรอบแต่ละข้อความในไฟล์ MBOX ได้ ด้วยการใช้เมธอดนี้ จะสามารถดึงข้อความแต่ละรายการได้โดยไม่ต้องเดินทางผ่านที่เก็บทั้งหมดซ้ำหลายครั้ง ซึ่งช่วยเพิ่มประสิทธิภาพและลดเวลาในการประมวลผล

นี้ MboxMessageInfo class ให้ EntryId คุณสมบัติ ซึ่งให้การเข้าถึงตัวระบุที่เป็นเอกลักษณ์ของแต่ละข้อความในไฟล์ MBOX ตัวระบุนี้สามารถจัดเก็บในฐานข้อมูลหรือใช้เป็นอ้างอิงเพื่อค้นหาและดึงข้อความเฉพาะได้อย่างรวดเร็วเมื่อจำเป็น

นี้ ExtractMessage(string id) เมธอดใน MboxStorageReader คลาสนี้ช่วยนักพัฒนาในการดึงข้อความโดยอิงจาก EntryId ที่เป็นเอกลักษณ์ของแต่ละข้อความ ด้วย ExtractMessage(string id) เมธอดนี้ คุณสามารถใช้ EntryId ที่เก็บไว้เพื่อดึงข้อความที่สอดคล้องและทำการดำเนินการเพิ่มเติมกับมัน

ตัวอย่างโค้ดต่อไปนี้สาธิตวิธีดึงข้อความจากไฟล์ MBOX โดยใช้ตัวระบุ:

MboxStorageReader reader = MboxStorageReader.CreateReader("my.mbox", new MboxLoadOptions());

foreach (MboxMessageInfo msgInfo in reader.EnumerateMessageInfo())
{
    MailMessage eml = reader.ExtractMessage(msgInfo.EntryId, new EmlLoadOptions());
}

กำหนดค่าตัวเลือกการโหลดเมื่ออ่านข้อความจาก MBOX

คุณลักษณะต่อไปนี้จะช่วยให้คุณระบุตัวเลือกต่างๆ ที่เกี่ยวกับการโหลดและประมวลผลข้อความ:

  • คุณสมบัติ MailStorageConverter.MboxMessageOptions - รับหรือกำหนดตัวเลือกการโหลดอีเมลเมื่อทำการแยกวิเคราะห์ที่เก็บ Mbox

  • เมธอด MboxrdStorageReader.ReadNextMessage(EmlLoadOptions options) - พารามิเตอร์ EmlLoadOptions ระบุตัวเลือกเมื่ออ่านข้อความจากที่เก็บ Mbox

var reader = new MboxrdStorageReader(fileName, new MboxLoadOptions());
// Read messages preserving tnef attachments.
var eml = reader.ReadNextMessage(new EmlLoadOptions {PreserveTnefAttachments = true});
MailStorageConverter.MboxMessageOptions(new EmlLoadOptions {PreserveTnefAttachments = true});
// Convert messages from mbox to pst preserving tnef attachments.
var pst = MailStorageConverter.mboxToPst("Input.mbox", "Output.pst");

การตั้งค่าการเข้ารหัสข้อความที่ต้องการขณะโหลดไฟล์ Mbox เพื่อการอ่าน

ตัวเลือกการเข้ารหัสมีให้สำหรับคลาส MboxrdStorageReader ซึ่งให้ตัวเลือกเพิ่มเติมสำหรับการโหลดไฟล์ mbox และรับประกันว่าข้อความที่มีเนื้อหาเข้ารหัสจะถูกอ่านและประมวลผลอย่างถูกต้อง โค้ดตัวอย่างต่อไปนี้แสดงวิธีตั้งค่าการเข้ารหัสข้อความให้ตรงกับความต้องการของคุณ:

var reader = new MboxrdStorageReader("sample.mbox", new MboxLoadOptions() { PreferredTextEncoding = Encoding.UTF8});
var message = reader.ReadNextMessage();

รับจำนวนข้อความทั้งหมดจากไฟล์ MBOX

นี้ MboxrdStorageReader คลาสนี้ให้ความสามารถในการอ่านจำนวนรายการที่มีในไฟล์ MBox ซึ่งสามารถใช้พัฒนาแอปพลิเคชันเพื่อแสดงความคืบหน้าของกิจกรรมขณะประมวลผลไฟล์ดังกล่าวได้.

// The path to the File directory.
var dataDir = RunExamples.GetDataDir_Thunderbird();

using (var stream = new FileStream(dataDir + "ExampleMbox.mbox", FileMode.Open, FileAccess.Read))
using (var reader = new MboxrdStorageReader(stream, false))
{
    Console.WriteLine("Total number of messages in Mbox file: " + reader.GetTotalItemsCount());
}

รับขนาดข้อความปัจจุบัน

using (var stream = new FileStream(dataDir + "ExampleMbox.mbox", FileMode.Open, FileAccess.Read))
using (var reader = new MboxrdStorageReader(stream, false))
{
    MailMessage msg;
    while ((msg = reader.ReadNextMessage()) != null)
    {
        long currentDataSize = reader.CurrentDataSize;

        msg.Dispose();
    }
}

การแปลง MBOX เป็น PST พร้อมรักษาหรือเอาลายเซ็นออก

หากต้องการลบลายเซ็นจากไฟล์ระหว่างกระบวนการแปลง ให้ตั้งค่า MboxToPstConversionOptions.RemoveSignature ตั้งคุณสมบัติเป็น true.

ตัวอย่างโค้ดต่อไปนี้แสดงวิธีการใช้คุณสมบัตินี้:

var pstDataStream = new MemoryStream();
var personalStorage = PersonalStorage.Create(pstDataStream, FileFormatVersion.Unicode);
MailStorageConverter.MboxToPst(new MboxrdStorageReader(new FileStream(fileName, FileMode.Open, FileAccess.Read), new MboxLoadOptions()),
personalStorage,
    "Inbox",
new MboxToPstConversionOptions() { RemoveSignature = true });

การเขียนไฟล์ MBOX

นี้ MboxrdStorageWriter คลาสนี้ให้ความสามารถในการเขียนข้อความใหม่ไปยังไฟล์ที่เก็บเมลของ Thunderbird เพื่อเขียนข้อความ:

  1. เปิดไฟล์ที่เก็บของ Thunderbird ใน FileStream.
  2. สร้างอินสแตนซ์ของ MboxrdStorageWriter คลาสและส่งสตรีมที่กล่าวถึงข้างต้นไปยังคอนสตรัคเตอร์.
  3. เตรียมข้อความใหม่โดยใช้ MailMessage คลาส.
  4. เรียกใช้ WriteMessage() เมธอดและส่งค่าที่กล่าวถึงข้างต้น MailMessage อินสแตนซ์เพื่อเพิ่มข้อความไปยังที่เก็บของ Thunderbird.
  5. ปิดสตรีมทั้งหมด.

โค้ดตัวอย่างต่อไปนี้แสดงวิธีเขียนข้อความไปยังที่เก็บเมลของ Thunderbird

// Open the storage file with FileStream
var stream = new FileStream(dataDir + "ExampleMbox.mbox", FileMode.Open, FileAccess.Write);

// Initialize MboxStorageWriter and pass the above stream to it
var writer = new MboxrdStorageWriter(stream, false);
// Prepare a new message using the MailMessage class
var message = new MailMessage("from@domain.com", "to@domain.com", Guid.NewGuid().ToString(), "added from Aspose.Email");
message.IsDraft = false;
// Add this message to storage
writer.WriteMessage(message);
// Close all related streams
writer.Dispose();
stream.Close();

แยกที่จัดเก็บ MBOX/ยกเลิกการแยกส่วน

Aspose.Email มีเมธอดสำหรับแยกที่เก็บข้อมูล Mbox ให้เป็นส่วนย่อย ทำให้จัดการกับคลังอีเมลขนาดใหญ่ได้ง่ายขึ้น ขึ้นอยู่กับเวอร์ชัน .NET ที่คุณใช้ เมธอดและพารามิเตอร์ที่ใช้ได้อาจแตกต่างกัน ด้านล่างเป็นเมธอดของ MboxStorageReader คลาสที่ใช้ได้ทั้งสำหรับ .NET Framework 4.5, เวอร์ชัน .NET Core และเวอร์ชันที่ต่ำกว่า 4.5

สมาชิกสำหรับ .NET Framework 4.5 และเวอร์ชัน .NET Core:

  • SplitInto(long chunkSize, string outputPath, CancellationToken token) - แบ่งพื้นที่เก็บ Mbox เป็นส่วนย่อยตามขนาดชิ้นส่วนที่ระบุ

  • พารามิเตอร์:

    • chunkSize: ขนาดโดยประมาณของแต่ละส่วนเป็นไบต์
    • outputPath: เส้นทางโฟลเดอร์ที่ส่วนข้อมูลจะถูกสร้าง
    • token: CancellationToken ที่อนุญาตให้สามารถยกเลิกการทำงานได้
  • SplitInto(long chunkSize, string outputPath, string partFileNamePrefix, CancellationToken token) - แบ่งพื้นที่เก็บ Mbox เป็นส่วนย่อย ๆ พร้อมคำนำหน้าชื่อไฟล์ที่กำหนดสำหรับแต่ละส่วน

  • พารามิเตอร์:

    • chunkSize: ขนาดโดยประมาณของแต่ละส่วนเป็นไบต์
    • outputPath: เส้นทางโฟลเดอร์ที่ส่วนข้อมูลจะถูกสร้าง
    • partFileNamePrefix: คำนำหน้าที่จะถูกเพิ่มเข้าไปในชื่อไฟล์ของแต่ละส่วน
    • token: CancellationToken ที่อนุญาตให้สามารถยกเลิกการทำงานได้

สมาชิกสำหรับเวอร์ชัน .NET Framework ที่ต่ำกว่า 4.5:

  • SplitInto(long chunkSize, string outputPath) - แบ่งพื้นที่เก็บ Mbox เป็นส่วนย่อยตามขนาดชิ้นส่วนที่ระบุ

  • SplitInto(long chunkSize, string outputPath, string partFileNamePrefix) - แบ่งพื้นที่เก็บ Mbox เป็นส่วนย่อย ๆ พร้อมคำนำหน้าชื่อไฟล์ที่กำหนดสำหรับแต่ละส่วน

  • Cancel() - ยกเลิกการดำเนินการแยกที่กำลังทำอยู่

ตัวอย่างโค้ดต่อไปนี้แสดงวิธีแบ่งไฟล์ MBOX ออกเป็นส่วน ๆ โดยจำกัดจำนวนสูงสุดที่ห้าส่วน พร้อมใช้กลไกการยกเลิก:

.NET Framework 4.5 และ .NET Core:

int partCount = 0;

var tokenSource = new CancellationTokenSource();

var mbox = new MboxrdStorageReader(fileName, new MboxLoadOptions { LeaveOpen = false });

// Subscribe to events
mbox.MboxFileCreated += (sender, e) =>
{
    partCount++;
    if (partCount >= 5)
        tokenSource.Cancel();
};

System.Threading.Tasks.Task task = mbox.SplitInto(10000000, outputPath, tokenSource.Token);
task.Wait();

.NET Framework ต่ำกว่า 4.5:

int partCount = 0;
var mbox = new MboxrdStorageReader(fileName, new MboxLoadOptions { LeaveOpen = false });
mbox.SplitInto(10000000, outputPath);

mbox.MboxFileCreated += (sender, e) =>
{
    partCount++;
    if (partCount >= 5)
        mbox.Cancel();
};