
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 类具有 HasMessages 和 MessageCount 属性,返回文件夹中消息的存在情况及其数量:
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 的信息。您也可以在我们的 论坛 中分享您的问题或请求。