在 C# .NET 中讀取 MS Outlook OLM 檔案

OLM 是 Microsoft Outlook for Mac 用於儲存本地數據的檔案格式。OLM 包含本地數據,例如電子郵件、附件、筆記、日曆數據、聯絡人、任務、歷史記錄等。OLM 檔案由 Outlook for Mac 使用。Windows 版本的 Outlook 無法訪問或打開它。Windows 版本的 Outlook 僅支持 PST 檔案格式來儲存數據。在這篇文章中,我們將考慮 如何從 C# 應用程序打開和讀取 OLM 格式檔案

C# .NET API 讀取 OLM 檔案

Aspose.Email for .NET 是一個強大的 API,提供了一系列功能來實現電子郵件應用程序。此外,它還允許讀取 OLM 檔案和其他郵件儲存格式,例如 MBOX、PST/OST。您可以通過 NuGet 安裝庫或 下載 其 DLL。

PM> Install-Package Aspose.Email

打開 OLM 格式檔案

Aspose.Email API 提供了兩種方法來打開 OLM 格式檔案:

這些方法之間的行為有差異。請參見下面的部分。

通過建構函數打開檔案

要打開檔案,您應調用 OlmStorage 類的 建構函數,並將完整檔案名稱或流作為參數傳遞給它:

var fileName = "MyStorage.olm";
var olm = new OlmStorage(fileName);

使用靜態方法 FromFile 打開檔案

要打開檔案,您應使用靜態方法 FromFile,並將完整檔案名稱或流作為參數傳遞給它:

var fileName = "MyStorage.olm";
var olm = OlmStorage.FromFile(fileName);

獲取資料夾

使用建構函數打開檔案後,將可以訪問 FolderHierarchy 屬性。它返回 OLM 檔案中存在的目錄列表。列表中每個 OlmFolder 類的對象都有 SubFolders 屬性,該屬性返回子資料夾的列表。因此,我們可以訪問 OLM 中的所有目錄。

以下示例顯示了按層次順序排列的所有資料夾列表:

using (var olm = new OlmStorage(fileName))
{
PrintAllFolders(olm.FolderHierarchy, string.Empty);
}
private void PrintAllFolders(List<OlmFolder> folderHierarchy, string indent)
{
foreach (var folder in folderHierarchy)
{
Console.WriteLine($"{indent}{folder.Name}");
PrintAllFolders(folder.SubFolders, indent+"-");
}
}

如果使用 FromFile 方法打開檔案,則默認情況下 FolderHierarchy 屬性將不會被初始化,並將返回 null。在這種情況下,必須明確調用 GetFolders 方法:

using (var olm = OlmStorage.FromFile(fileName))
{
var folders = olm.GetFolders();
}

此外,可以按名稱獲取任何資料夾。為此,您應:

  • 調用 GetFolder 方法

  • 將資料夾名稱作為第一個參數,並將顯示在搜索資料夾時是否忽略大小寫的值作為第二個參數傳遞。

using (var olm = OlmStorage.FromFile(fileName))
{
// get inbox folder by name
OlmFolder folder = olm.GetFolder("Inbox", true);
}

電子郵件列表

OlmFolder 類(表示資料夾)具有以下方法來獲取電子郵件列表:

  • EnumerateMessages 實現對資料夾中電子郵件的迭代。在這種情況下,每次迭代返回 OlmMessageInfo 對象,該對象提供有關電子郵件的簡要信息。

  • EnumerateMapiMessages 也實現對資料夾中電子郵件的迭代,但在這種情況下,每次迭代返回 MapiMessage 對象,該對象代表電子郵件本身,包含所有屬性。

使用 EnumerateMessages 方法

using (var olm = OlmStorage.FromFile(fileName))
{
var folder = olm.GetFolder("Inbox", true);
foreach (var messageInfo in folder.EnumerateMessages())
{
Console.WriteLine(messageInfo.Subject);
}
}

使用 EnumerateMapiMessages 方法

using (var olm = OlmStorage.FromFile(fileName))
{
var folder = olm.GetFolder("Inbox", true);
foreach (var msg in folder.EnumerateMapiMessages())
{
// save message in MSG format
msg.Save($"{msg.Subject}.msg");
}
}

其他有用的屬性

此外,OlmFolder 類還具有 HasMessagesMessageCount 屬性,這些屬性返回資料夾中消息的存在和數量:

using (var olm = OlmStorage.FromFile(fileName))
{
var folder = olm.GetFolder("Inbox", true);
if (folder.HasMessages)
{
Console.WriteLine($"Message count: {folder.MessageCount}");
}
}

提取電子郵件

OlmStorage 類具有 ExtractMapiMessage 方法,該方法允許提取電子郵件。此方法接收一個 OlmMessageInfo 對象。

using (var olm = OlmStorage.FromFile(fileName))
{
var folder = olm.GetFolder("Inbox", true);
foreach (var messageInfo in folder.EnumerateMessages())
{
if (messageInfo.Date == DateTime.Today)
{
// Extracts today's messages form Inbox
var msg = olm.ExtractMapiMessage(messageInfo);
}
}
}

結論

在這篇文章中,您學會了如何在 C# 中讀取 OLM 檔案。您已經看到獲取資料夾列表和從 OLM 檔案提取郵件的方法。此外,您可以通過 Aspose.Email for .NET 獲得更多信息,使用 文檔。同時,您可以在我們的 論壇 上分享您的問題或請求。

另請參閱