Việc di chuyển dữ liệu email từ Outlook for Mac (OLM) sang các định dạng được hỗ trợ rộng rãi như MBOX (cho Thunderbird / Unix mailboxes) và PST (Outlook for Windows) là một nhiệm vụ phổ biến khi chuyển đổi giữa các nền tảng. Microsoft Outlook for Mac sử dụng định dạng OLM (Outlook for Mac Data File) để lưu trữ email, danh bạ, lịch và các mục khác. Tuy nhiên, việc di chuyển dữ liệu này sang môi trường dựa trên Windows hoặc các khách hàng email khác thường đòi hỏi chuyển đổi các tệp OLM sang các định dạng được hỗ trợ toàn cầu như MBOX (được sử dụng bởi các khách hàng như Thunderbird và Apple Mail) hoặc PST (Outlook Personal Storage Table for Windows).
Trong bài viết này, chúng tôi sẽ chỉ cho bạn cách chuyển đổi các tệp OLM sang định dạng PST và MBOX trong C# bằng cách sử dụng Aspose.Email for .NET, một API mạnh mẽ giúp đơn giản hóa các nhiệm vụ di chuyển email phức tạp một cách lập trình. Bạn sẽ học cách mở các tệp OLM, trích xuất tin nhắn, bảo tồn cấu trúc thư mục, và tạo ra các kho lưu trữ email di động cho nhiều nền tảng.
Sử dụng Aspose.Email for .NET để Chuyển đổi
[Aspose.Email for .NET][] cung cấp các tính năng toàn diện để làm việc với nhiều định dạng email khác nhau, bao gồm OLM, MBOX và PST. Nó đơn giản hóa các nhiệm vụ chuyển đổi phức tạp với API trực quan và tài liệu phong phú. Dưới đây, chúng tôi sẽ hướng dẫn các bước chuyển đổi OLM sang MBOX và PST bằng C#.
Để bắt đầu, cài đặt gói Aspose.Email NuGet trong dự án .NET của bạn:
Install-Package Aspose.Email
Gói này bao gồm tất cả các lớp cần thiết để xử lý các tệp OLM, MBOX và PST.
Chuyển đổi OLM sang MBOX
Định dạng MBOX lưu trữ các tin nhắn email dưới dạng các mục MIME được nối tiếp nhau, thường được các client email mã nguồn mở sử dụng. Dưới đây là một ví dụ mã đơn giản nhưng hiệu quả để chuyển đổi tất cả các tin nhắn từ một thư mục OLM sang tệp MBOX. Nó sử dụng các thành viên API sau:
- OlmStorage.FromFile(…) - Mở một kho lưu trữ OLM và cung cấp cho bạn quyền truy cập vào cây thư mục và các mục của nó. Bạn có thể sử dụng để liệt kê các thư mục hoặc trích xuất tin nhắn từ tệp OLM.
- GetFolder(string name, bool ignoreCase) - Trả về một OlmFolder cho tên thư mục được yêu cầu.
- OlmFolder.EnumerateMapiMessages() - Duyệt các mục MapiMessage trong thư mục đó.
- MapiMessage.ToMailMessage(MailConversionOptions) - Chuyển đổi một MapiMessage thành một MailMessage (MIME).
- MboxrdStorageWriter.WriteMessage(MailMessage) - Ghi một MailMessage MIME vào luồng MBOX.
Các bước
- Xác định đường dẫn tệp cho tệp OLM đầu vào và tệp MBOX đầu ra.
- Mở tệp OLM bằng cách sử dụng
OlmStorage.FromFile. - Tạo một trình ghi MBOX bằng
MboxrdStorageWritervới đường dẫn đầu ra và các tùy chọn đã chỉ định. - Truy cập thư mục “Inbox” từ tệp OLM bằng tìm kiếm không phân biệt chữ hoa chữ thường.
- Lặp qua tất cả các tin nhắn MAPI trong thư mục “Inbox”.
- Chuyển đổi mỗi tin nhắn MAPI thành đối tượng
MailMessagetiêu chuẩn. - Ghi mỗi tin nhắn đã chuyển đổi vào tệp MBOX.
Ví dụ mã
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);
}
}
Lưu ý:
Nếu bạn muốn một tệp MBOX cho mỗi thư mục, tạo một writer riêng cho mỗi thư mục OLM.
Nếu bạn muốn một kho lưu trữ duy nhất, tái sử dụng một thể hiện MboxrdStorageWriter và gọi WriteMessage liên tục như trong ví dụ mã trên.
Chuyển đổi OLM sang PST
Việc chuyển đổi OLM sang PST thường không chỉ yêu cầu sao chép tin nhắn mà còn phải tái tạo cấu trúc thư mục. Đoạn mã mẫu dưới đây minh họa cách chuyển đổi và sao chép cấu trúc thư mục và tin nhắn từ tệp lưu trữ OLM của Outlook sang tệp PST Unicode bằng cách sử dụng Aspose.Email for .NET.
Các thành viên chính
- PersonalStorage.Create(path, FileFormatVersion.Unicode) – Tạo một tệp PST Unicode mới và trả về một thể hiện PersonalStorage. Sử dụng PersonalStorage.Load(…) để mở các PST hiện có. Lớp PersonalStorage là điểm khởi đầu để làm việc với các tệp PST.
- PersonalStorage.RootFolder – Cung cấp thư mục gốc FolderInfo cho PST. Sử dụng FolderInfo.AddSubFolder(name) để tạo thư mục con. FolderInfo.GetSubFolders() trả về các thư mục con để bạn có thể kiểm tra xem đã tồn tại thư mục có cùng tên chưa.
- OlmStorage.GetFolders() – Trả về bộ sưu tập OlmFolder cấp cao nhất (cây thư mục OLM). Thuộc tính OlmFolder.SubFolders chứa các thư mục con (để bạn có thể duyệt đệ quy).
- OlmFolder.EnumerateMapiMessages() – Trả về các đối tượng MapiMessage.
- FolderInfo.AddMessage(MapiMessage) – Thêm một MapiMessage vào thư mục PST.
Các bước thực hiện
- Đặt đường dẫn tệp cho tệp OLM nguồn và tệp PST đích.
- Mở kho lưu trữ OLM để đọc và tạo một tệp PST mới để ghi.
- Lấy các thư mục cấp cao nhất từ kho lưu trữ OLM.
- Định nghĩa một hàm trợ giúp để tìm hoặc tạo một thư mục tương ứng trong PST cho một tên thư mục cho trước.
- Định nghĩa một hàm đệ quy để:
- Tạo hoặc lấy thư mục PST tương ứng cho mỗi thư mục OLM.
- Sao chép tất cả tin nhắn từ thư mục OLM sang thư mục PST.
- Gọi lại chính nó cho mỗi thư mục con trong thư mục OLM để duy trì cấu trúc cây.
- Gọi hàm đệ quy trên tất cả các thư mục OLM cấp cao nhất, sử dụng thư mục gốc PST làm cha.
- Lưu toàn bộ cấu trúc thư mục và tin nhắn vào tệp PST mới, bảo toàn dữ liệu MAPI.
Mẫu mã
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);
}
}
Quan trọng: một PST mới tạo đã bao gồm thư mục Deleted Items theo mặc định — vì vậy hãy cẩn thận không tạo trùng các thư mục mặc định.
Lưu ý:
Giữ nguyên loại thư mục: Các thư mục con OLM có thể ánh xạ tới các thư mục đặc biệt của Outlook (Hộp thư đến, Thư đã gửi, Lịch). Nếu bạn muốn tạo các thư mục IPM đã định nghĩa trước (để Outlook nhận dạng chúng là thư mục tiêu chuẩn), hãy sử dụng PersonalStorage.CreatePredefinedFolder hoặc GetPredefinedFolder tùy theo kịch bản. CreatePredefinedFolder trả về một FolderInfo. Sử dụng enum StandardIpmFolder khi phù hợp.
Hiệu năng: AddMessages (thêm hàng loạt) nhanh hơn so với nhiều lần gọi AddMessage. Hãy cân nhắc thu thập các tin nhắn thành các lô và sử dụng FolderInfo.AddMessages(IEnumerable) để giảm I/O đĩa.
Kết luận
Trong bài viết này, chúng tôi đã tìm hiểu cách chuyển đổi các tệp Outlook for Mac (OLM) sang định dạng PST và MBOX trong C# bằng cách sử dụng Aspose.Email for .NET. Chúng tôi đã khám phá cách mở và xử lý các kho lưu trữ OLM, trích xuất tin nhắn và bảo tồn cấu trúc thư mục khi xuất dữ liệu sang các định dạng lưu trữ thư mới. Với Aspose.Email API, các nhà phát triển có thể dễ dàng tự động hoá việc di chuyển email đa nền tảng, đảm bảo tính tương thích giữa Outlook for Mac, Outlook for Windows và các khách hàng mã nguồn mở như Thunderbird.
Để biết thêm chi tiết, khám phá tài liệu Aspose.Email và tham chiếu API.
