将 Outlook for Mac (OLM) 的电子邮件数据迁移到广泛支持的格式,如 MBOX(用于 Thunderbird / Unix 邮箱)和 PST(Outlook for Windows),是跨平台迁移时的常见任务。Microsoft Outlook for Mac 使用 OLM(Outlook for Mac 数据文件)格式来存储电子邮件、联系人、日历和其他项目。然而,将这些数据迁移到基于 Windows 的环境或其他电子邮件客户端通常需要将 OLM 文件转换为通用支持的格式,如 MBOX(被 Thunderbird、Apple Mail 等客户端使用)或 PST(Windows 版 Outlook 的个人存储表)。
在本文中,我们将向您展示如何在 C# 中使用 Aspose.Email for .NET 将 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 文件夹——因此请注意不要复制默认文件夹。
注意:
保留文件夹类型: 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 documentation 和 API 参考。
