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 成员:

步骤

  1. 为输入的 OLM 文件和输出的 MBOX 文件定义文件路径。
  2. 使用 OlmStorage.FromFile 打开 OLM 文件。
  3. 使用 MboxrdStorageWriter 并指定输出路径和选项,创建 MBOX 写入器。
  4. 使用不区分大小写的搜索,从 OLM 文件中访问 “Inbox” 文件夹。
  5. 遍历 “Inbox” 文件夹中的所有 MAPI 消息。
  6. 将每个 MAPI 消息转换为标准的 MailMessage 对象。
  7. 将每个转换后的消息写入 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 文件中。

关键成员

步骤

  1. 设置源 OLM 文件和目标 PST 文件的路径。
  2. 打开 OLM 存档进行读取,并创建一个新的 PST 文件用于写入。
  3. 从 OLM 存档中获取顶层文件夹。
  4. 定义一个帮助函数,用于在 PST 中查找或创建与给定文件夹名称对应的文件夹。
  5. 定义一个递归函数,以实现:
    • 为每个 OLM 文件夹创建或获取对应的 PST 文件夹;
    • 将 OLM 文件夹中的所有邮件复制到 PST 文件夹;
    • 对 OLM 文件夹的每个子文件夹递归调用自身,以保持文件夹树结构。
  6. 对所有顶层 OLM 文件夹调用递归函数,以 PST 根文件夹作为父文件夹。
  7. 将完整的文件夹层次结构和邮件保存到新的 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 文件夹——因此请注意不要复制默认文件夹。

注意:

结论

在本文中,我们学习了如何使用 Aspose.Email for .NET 在 C# 中将 Outlook for Mac (OLM) 文件转换为 PST 和 MBOX 格式。我们探讨了如何打开和处理 OLM 存档、提取邮件,并在导出数据到新邮件存储格式时保留文件夹层次结构。借助 Aspose.Email API,开发人员可以轻松实现跨平台电子邮件迁移,确保 Outlook for Mac、Outlook for Windows 与诸如 Thunderbird 等开源客户端之间的兼容性。

欲了解更多细节,请查阅 Aspose.Email documentationAPI 参考

附加资源

另请参阅