將電子郵件資料從 Outlook for Mac (OLM) 遷移到廣泛支援的格式,如 MBOX(用於 Thunderbird / Unix 郵箱)和 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)。
在本文中,我們將向您展示如何使用 Aspose.Email for .NET 以 C# 將 OLM 檔案轉換為 PST 和 MBOX 格式,這是一個功能強大的 API,能以程式方式簡化複雜的電子郵件遷移任務。您將學習如何開啟 OLM 檔案、提取訊息、保留資料夾層級,並為多平台生成可攜式的電子郵件存檔。
使用 Aspose.Email for .NET 進行轉換
[Aspose.Email for .NET][] 提供全面的功能以處理各種電子郵件格式,包括 OLM、MBOX 和 PST。它以直觀的 API 和豐富的文件簡化了複雜的轉換任務。下面,我們將演示使用 C# 將 OLM 轉換為 MBOX 和 PST 的步驟。
要開始使用,請在您的 .NET 專案中安裝 Aspose.Email NuGet 套件:
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) - 將 MIME MailMessage 寫入 MBOX 串流。
步驟
- 定義輸入 OLM 檔案和輸出 MBOX 檔案的檔案路徑。
- 使用
OlmStorage.FromFile開啟 OLM 檔案。 - 使用
MboxrdStorageWriter並指定輸出路徑和選項,建立 MBOX 寫入器。 - 以不區分大小寫的方式從 OLM 檔案中存取 “Inbox” 資料夾。
- 迭代 “Inbox” 資料夾中的所有 MAPI 訊息。
- 將每個 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,請為每個 OLM 資料夾建立單獨的 writer。
如果您偏好單一封存檔,請重複使用同一個 MboxrdStorageWriter 實例,並如上方程式碼範例所示多次呼叫 WriteMessage。
將 OLM 轉換為 PST
將 OLM 轉換為 PST 時,通常不僅需要複製訊息,還必須重新建立資料夾層級。以下程式碼範例示範如何使用 Aspose.Email for .NET,將 Outlook OLM 封存檔的資料夾結構與訊息轉換並複製到 Unicode PST 檔案。
關鍵成員
- PersonalStorage.Create(path, FileFormatVersion.Unicode) - 建立一個新的 Unicode PST 檔案,並傳回 PersonalStorage 實例。使用 PersonalStorage.Load(…) 開啟現有的 PST。 PersonalStorage 類別是處理 PST 檔案的入口點。
- PersonalStorage.RootFolder - 取得 PST 的根 FolderInfo。使用 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 中尋找或建立與給定資料夾名稱相符的資料夾。
- 定義遞迴函式,以:
- 為每個 OLM 資料夾建立或取得對應的 PST 資料夾。
- 將所有訊息從 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 資料夾 — 請小心不要重複建立預設資料夾。
Note:
- 保留資料夾類型:OLM 子資料夾可能對應到特定的 Outlook 特殊資料夾(收件匣、已傳送項目、行事曆)。如果您想建立 預先定義的 IPM 資料夾(讓 Outlook 將其識別為標準資料夾),請根據情況使用 PersonalStorage.CreatePredefinedFolder 或 GetPredefinedFolder。CreatePredefinedFolder 會回傳一個 FolderInfo。在適當時使用 StandardIpmFolder 列舉。
- 效能:使用 AddMessages(批次新增)比多次呼叫 AddMessage 更快。建議將訊息收集成批次,並使用 FolderInfo.AddMessages(IEnumerable) 以減少磁碟 I/O。
結論
在本文中,我們學習了如何使用 Aspose.Email for .NET 在 C# 中將 Outlook for Mac (OLM) 檔案轉換為 PST 和 MBOX 格式。我們探討了如何打開和處理 OLM 壓縮檔、提取訊息,並在匯出資料到新郵件儲存格式時保留資料夾層次結構。借助 Aspose.Email API,開發人員可以輕鬆自動化跨平台的電子郵件遷移,確保 Outlook for Mac、Outlook for Windows 與像 Thunderbird 這樣的開源客戶端之間的相容性。
如需進一步了解,請探索 Aspose.Email 文檔 和 API 參考。
