プラットフォーム間の移行時に、Outlook for Mac (OLM) から MBOX(Thunderbird / Unix メールボックス用)や PST(Outlook for Windows 用)といった広くサポートされている形式へメールデータを移行することは一般的な作業です。Microsoft Outlook for Mac は、メール、連絡先、カレンダー、その他のアイテムを保存するために OLM(Outlook for Mac Data File)形式を使用します。ただし、このデータを Windows ベースの環境や他のメールクライアントに移行するには、OLM ファイルを MBOX(Thunderbird や Apple Mail などのクライアントで使用)や PST(Windows 用 Outlook Personal Storage Table)といった汎用フォーマットに変換する必要があります。

この記事では、Aspose.Email for .NET を使用して C# で 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);
    }
}

注意:
フォルダーごとに 1 つの MBOX が必要な場合は、各 OLM フォルダー用に別々の writer を作成します。
1 つのアーカイブにまとめたい場合は、上記コードサンプルのように MboxrdStorageWriter インスタンスを再利用し、WriteMessage を繰り返し呼び出します。

Convert OLM to PST

OLM から PST への変換では、メッセージのコピーだけでなくフォルダー階層の再現も必要になることがよくあります。以下のコードサンプルは、Outlook OLM アーカイブ ファイルから Unicode PST ファイルへフォルダー構造とメッセージを変換してコピーする方法を示しています。使用するのは Aspose.Email for .NET です。

主要メンバー

手順

  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 フォルダーが既に含まれています — デフォルトフォルダーを重複しないよう注意してください。

注:

  • フォルダータイプの保持: OLM サブフォルダーは特定の Outlook の特殊フォルダー(受信トレイ、送信済みアイテム、カレンダー)にマップされることがあります。事前定義された IPM フォルダー を作成して Outlook が標準フォルダーとして認識させたい場合は、シナリオに応じて PersonalStorage.CreatePredefinedFolder または GetPredefinedFolder を使用してください。CreatePredefinedFolderFolderInfo を返します。適切な場合は StandardIpmFolder 列挙体を使用します。

  • パフォーマンス: AddMessages(一括追加)は AddMessage を多数呼び出すよりも高速です。メッセージをバッチにまとめて、FolderInfo.AddMessages(IEnumerable) を使用してディスク I/O を削減することを検討してください。

結論

この記事では、C# と Aspose.Email for .NET を使用して、Outlook for Mac (OLM) ファイルを PST および MBOX 形式に変換する方法を学びました。OLM アーカイブの開封と処理、メッセージの抽出、フォルダー階層の保持を行いながら、データを新しいメールストレージ形式へエクスポートする手順を検討しました。Aspose.Email API を使用すれば、開発者はクロスプラットフォームのメール移行を簡単に自動化でき、Outlook for Mac、Outlook for Windows、そして Thunderbird のようなオープンソースクライアント間の互換性を確保できます。

詳細については、Aspose.Email documentationAPI reference をご覧ください。

追加リソース

参照