การย้ายข้อมูลอีเมลจาก Outlook for Mac (OLM) ไปยังรูปแบบที่ได้รับการสนับสนุนอย่างกว้างขวางเช่น MBOX (สำหรับ Thunderbird / Unix mailboxes) และ PST (Outlook for Windows) เป็นงานทั่วไปเมื่อย้ายระหว่างแพลตฟอร์ม Microsoft Outlook for Mac ใช้รูปแบบ OLM (Outlook for Mac Data File) เพื่อจัดเก็บอีเมล รายชื่อผู้ติดต่อ ปฏิทิน และรายการอื่น ๆ อย่างไรก็ตาม การย้ายข้อมูลนี้ไปยังสภาพแวดล้อมที่ใช้ Windows หรือไคลเอนต์อีเมลอื่น ๆ มักต้องแปลงไฟล์ OLM ไปเป็นรูปแบบที่สนับสนุนโดยทั่วไปเช่น MBOX (ที่ใช้โดยไคลเอนต์เช่น Thunderbird และ Apple Mail) หรือ PST (Outlook Personal Storage Table for Windows).
ในบทความนี้ เราจะแสดงวิธีการแปลงไฟล์ OLM เป็นรูปแบบ PST และ MBOX ด้วย C# โดยใช้ Aspose.Email for .NET ซึ่งเป็น API ที่ทรงพลังที่ทำให้การย้ายอีเมลที่ซับซ้อนเป็นเรื่องง่ายโดยโปรแกรม คุณจะได้เรียนรู้วิธีเปิดไฟล์ OLM, ดึงข้อความ, รักษาโครงสร้างโฟลเดอร์, และสร้างไฟล์เก็บอีเมลแบบพกพาสำหรับหลายแพลตฟอร์ม
การใช้ Aspose.Email for .NET สำหรับการแปลง
[Aspose.Email for .NET][] ให้คุณสมบัติที่ครอบคลุมในการทำงานกับรูปแบบอีเมลต่าง ๆ รวมถึง OLM, MBOX, และ PST มันทำให้การแปลงที่ซับซ้อนง่ายขึ้นด้วย API ที่ใช้งานง่ายและเอกสารที่ละเอียดครบถ้วน ด้านล่างเราจะอธิบายขั้นตอนการแปลง OLM เป็น MBOX และ PST ด้วย C#
เพื่อเริ่มต้น ให้ติดตั้งแพ็กเกจ NuGet ของ Aspose.Email ในโครงการ .NET ของคุณ:
Install-Package Aspose.Email
แพคเกจนี้รวมคลาสที่จำเป็นทั้งหมดสำหรับการจัดการไฟล์ OLM, MBOX และ PST.
แปลง OLM เป็น MBOX
รูปแบบ MBOX จะจัดเก็บข้อความอีเมลเป็นรายการ MIME ที่ต่อเนื่องกัน ซึ่งมักใช้โดยไคลเอนต์อีเมลแบบโอเพนซอร์ส ด้านล่างเป็นตัวอย่างโค้ดที่เรียบง่ายแต่มีประสิทธิภาพสำหรับการแปลงข้อความทั้งหมดจากโฟลเดอร์ OLM ไปเป็นไฟล์ MBOX โดยใช้สมาชิก API ต่อไปนี้:
- OlmStorage.FromFile(…) - เปิดไฟล์เก็บ OLM และให้คุณเข้าถึงโครงสร้างโฟลเดอร์และรายการต่าง ๆ คุณสามารถใช้เพื่อแสดงรายการโฟลเดอร์หรือสกัดข้อความจากไฟล์ OLM
- GetFolder(string name, bool ignoreCase) - คืนค่า OlmFolder สำหรับชื่อโฟลเดอร์ที่ร้องขอ
- OlmFolder.EnumerateMapiMessages() - ทำการวนซ้ำรายการ MapiMessage ในโฟลเดอร์นั้น
- MapiMessage.ToMailMessage(MailConversionOptions) - แปลง MapiMessage เป็น MailMessage (MIME)
- MboxrdStorageWriter.WriteMessage(MailMessage) - เขียน MailMessage แบบ MIME ไปยังสตรีม MBOX
ขั้นตอน
- กำหนดเส้นทางไฟล์สำหรับไฟล์ OLM อินพุตและไฟล์ MBOX เอาต์พุต.
- เปิดไฟล์ OLM ด้วย
OlmStorage.FromFile. - สร้างตัวเขียน MBOX โดยใช้
MboxrdStorageWriterพร้อมเส้นทางเอาต์พุตและตัวเลือกที่ระบุ. - เข้าถึงโฟลเดอร์ “Inbox” จากไฟล์ OLM ด้วยการค้นหาแบบไม่สนใจตัวพิมพ์ใหญ่/เล็ก.
- วนลูปผ่านข้อความ MAPI ทั้งหมดในโฟลเดอร์ “Inbox”.
- แปลงข้อความ MAPI แต่ละรายการเป็นอ็อบเจ็กต์
MailMessageมาตรฐาน. - เขียนข้อความที่แปลงแล้วแต่ละรายการลงในไฟล์ MBOX.
ตัวอย่างโค้ด
var olmPath = @"C:\data\archive.olm";
var mboxPath = @"C:\data\output.mbox";
// Load OLM file using OlmStorage
using (var olm = OlmStorage.FromFile(olmPath))
using (var mboxWriter = new MboxrdStorageWriter(mboxPath, new MboxSaveOptions()))
{
// Get the folder (case-insensitive example)
var inbox = olm.GetFolder("Inbox", true);
// Iterate MAPI messages (returns MapiMessage objects)
foreach (MapiMessage mapi in inbox.EnumerateMapiMessages())
{
// Convert to MailMessage and write to MBOX
var mail = mapi.ToMailMessage(new MailConversionOptions());
mboxWriter.WriteMessage(mail);
}
}
หมายเหตุ:
หากคุณต้องการ MBOX หนึ่งไฟล์ต่อโฟลเดอร์ ให้สร้าง writer แยกสำหรับแต่ละโฟลเดอร์ OLM.
หากคุณต้องการเก็บเป็นไฟล์เดียว ให้ใช้ MboxrdStorageWriter ตัวเดียวและเรียก WriteMessage ซ้ำตามตัวอย่างโค้ดด้านบน.
แปลง OLM เป็น PST
การแปลง OLM เป็น PST มักต้องไม่เพียงแค่คัดลอกข้อความเท่านั้น แต่ยังต้องสร้างโครงสร้างโฟลเดอร์ใหม่ ตัวอย่างโค้ดด้านล่างแสดงวิธีการแปลงและคัดลอกโครงสร้างโฟลเดอร์และข้อความจากไฟล์เก็บอาร์ไคฟ์ OLM ของ Outlook ไปยังไฟล์ PST แบบ Unicode โดยใช้ Aspose.Email for .NET.
สมาชิกสำคัญ
- PersonalStorage.Create(path, FileFormatVersion.Unicode) - สร้างไฟล์ PST แบบ Unicode ใหม่และคืนค่าอินสแตนซ์ของ PersonalStorage ใช้ PersonalStorage.Load(…) เพื่อเปิด PST ที่มีอยู่แล้ว คลาส PersonalStorage เป็นจุดเริ่มต้นสำหรับการทำงานกับไฟล์ PST.
- PersonalStorage.RootFolder - ให้คุณเข้าถึง FolderInfo รากของ PST ใช้ FolderInfo.AddSubFolder(name) เพื่อสร้างโฟลเดอร์ย่อย FolderInfo.GetSubFolders() คืนค่าลูกโฟลเดอร์เพื่อให้คุณตรวจสอบได้ว่ามีโฟลเดอร์ที่มีชื่อเดียวกันอยู่แล้วหรือไม่.
- OlmStorage.GetFolders() - คืนค่าคอลเลกชันของ OlmFolder ระดับบนสุด (โครงสร้างโฟลเดอร์ของ OLM) คุณสมบัติ OlmFolder.SubFolders มีลูกโฟลเดอร์ (เพื่อให้คุณสามารถเดินทางแบบเรียกซ้ำได้).
- OlmFolder.EnumerateMapiMessages() - ให้ผลลัพธ์เป็นอินสแตนซ์ของ MapiMessage.
- FolderInfo.AddMessage(MapiMessage) - เพิ่ม MapiMessage ไปยังโฟลเดอร์ PST.
ขั้นตอน
- กำหนดเส้นทางไฟล์สำหรับไฟล์ OLM ต้นทางและไฟล์ PST ปลายทาง.
- เปิดอาร์ไคฟ์ OLM เพื่ออ่านและสร้างไฟล์ PST ใหม่เพื่อเขียน.
- ดึงโฟลเดอร์ระดับบนสุดจากอาร์ไคฟ์ OLM.
- กำหนดฟังก์ชันช่วยเหลือเพื่อค้นหาหรือสร้างโฟลเดอร์ที่ตรงกันใน PST สำหรับชื่อโฟลเดอร์ที่กำหนด.
- กำหนดฟังก์ชันแบบเรียกซ้ำเพื่อ:
- สร้างหรือดึงโฟลเดอร์ PST ที่สอดคล้องกับแต่ละโฟลเดอร์ OLM
- คัดลอกข้อความทั้งหมดจากโฟลเดอร์ OLM ไปยังโฟลเดอร์ PST
- เรียกตัวเองสำหรับแต่ละโฟลเดอร์ย่อยในโฟลเดอร์ OLM เพื่อรักษาโครงสร้างต้นไม้ของโฟลเดอร์
- เรียกฟังก์ชันแบบเรียกซ้ำบนโฟลเดอร์ OLM ระดับบนทั้งหมด โดยใช้โฟลเดอร์รากของ PST เป็นพาเรนท์.
- บันทึกโครงสร้างโฟลเดอร์และข้อความทั้งหมดลงในไฟล์ PST ใหม่ โดยคงข้อมูล MAPI ไว้.
ตัวอย่างโค้ด
var olmPath = @"C:\data\archive.olm";
var pstPath = @"C:\data\output.pst";
// Create a new PST file
using (var olm = OlmStorage.FromFile(olmPath))
using (var pst = PersonalStorage.Create(pstPath, FileFormatVersion.Unicode))
{
// Get top-level folders in OLM
var rootFolders = olm.GetFolders();
// Helper: map OlmFolder -> FolderInfo in PST by recursively creating subfolders
FolderInfo GetOrCreatePstFolder(FolderInfo parentPstFolder, string folderName)
{
// Try to find existing subfolder (case-insensitive)
foreach (var sub in parentPstFolder.GetSubFolders())
{
if (string.Equals(sub.DisplayName, folderName, StringComparison.OrdinalIgnoreCase))
return sub;
}
// Create new subfolder
return parentPstFolder.AddSubFolder(folderName);
}
// Recursive traversal
void ProcessOlmFolder(OlmFolder olmFolder, FolderInfo pstParent)
{
// Create / get the corresponding PST folder
var pstFolder = GetOrCreatePstFolder(pstParent, olmFolder.Name);
// Copy messages: OlmFolder.EnumerateMapiMessages returns MapiMessage instances
foreach (var mapi in olmFolder.EnumerateMapiMessages())
{
// AddMessage preserves MAPI data into PST
pstFolder.AddMessage(mapi);
}
// Recurse into OLM subfolders (OlmFolder.SubFolders property)
foreach (var child in olmFolder.SubFolders)
{
ProcessOlmFolder(child, pstFolder);
}
}
// Note: PST.RootFolder exists; create top-level folders under it.
foreach (var top in rootFolders)
{
// Skip creating a duplicate for default PST root folder names if needed
ProcessOlmFolder(top, pst.RootFolder);
}
}
สำคัญ: PST ที่สร้างใหม่จะมีโฟลเดอร์ Deleted Items อยู่แล้วโดยค่าเริ่มต้น — ดังนั้นควรระวังไม่ให้ทำซ้ำโฟลเดอร์เริ่มต้น.
หมายเหตุ:
การรักษาประเภทโฟลเดอร์: โฟลเดอร์ย่อย OLM อาจแมปไปยังโฟลเดอร์พิเศษของ Outlook ที่ระบุ (Inbox, Sent Items, Calendar). หากคุณต้องการสร้าง โฟลเดอร์ IPM ที่กำหนดล่วงหน้า (เพื่อให้ Outlook จดจำเป็นโฟลเดอร์มาตรฐาน) ให้ใช้ PersonalStorage.CreatePredefinedFolder หรือ GetPredefinedFolder ตามสถานการณ์. CreatePredefinedFolder จะคืนค่าเป็น FolderInfo. ใช้ enum StandardIpmFolder เมื่อเหมาะสม.
ประสิทธิภาพ: AddMessages (การเพิ่มเป็นกลุ่ม) เร็วกว่าเรียกหลายครั้งของ AddMessage. ควรรวบรวมข้อความเป็นชุดและใช้ FolderInfo.AddMessages(IEnumerable) เพื่อลดการอ่าน/เขียนบนดิสก์.
สรุป
ในบทความนี้ เราได้เรียนรู้วิธีแปลงไฟล์ Outlook for Mac (OLM) ไปเป็นรูปแบบ PST และ MBOX ด้วย C# โดยใช้ Aspose.Email for .NET เราได้สำรวจวิธีการเปิดและประมวลผลไฟล์ OLM, ดึงข้อความออก, และรักษาโครงสร้างโฟลเดอร์ขณะส่งออกข้อมูลไปยังรูปแบบการจัดเก็บเมลใหม่ ด้วย Aspose.Email API นักพัฒนาสามารถทำงานอัตโนมัติการย้ายอีเมลข้ามแพลตฟอร์มได้อย่างง่ายดาย เพื่อให้แน่ใจว่ามีความเข้ากันได้ระหว่าง Outlook for Mac, Outlook for Windows และไคลเอนต์โอเพ่นซอร์สเช่น Thunderbird.
สำหรับรายละเอียดเพิ่มเติม, สำรวจ เอกสาร Aspose.Email และ อ้างอิง API.
