在 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 的信息。您也可以在我们的 论坛 中分享您的问题或请求。

另请参阅