プラットフォーム間の移行時に、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 メンバーを利用しています:
- 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);
}
}
注意:
フォルダーごとに 1 つの MBOX が必要な場合は、各 OLM フォルダー用に別々の writer を作成します。
1 つのアーカイブにまとめたい場合は、上記コードサンプルのように MboxrdStorageWriter インスタンスを再利用し、WriteMessage を繰り返し呼び出します。
Convert OLM to PST
OLM から PST への変換では、メッセージのコピーだけでなくフォルダー階層の再現も必要になることがよくあります。以下のコードサンプルは、Outlook OLM アーカイブ ファイルから Unicode PST ファイルへフォルダー構造とメッセージを変換してコピーする方法を示しています。使用するのは Aspose.Email for .NET です。
主要メンバー
- PersonalStorage.Create(path, FileFormatVersion.Unicode) – 新しい Unicode PST ファイルを作成し、PersonalStorage インスタンスを返します。既存の PST を開くには PersonalStorage.Load(…) を使用します。PersonalStorage クラスは PST ファイル操作のエントリ ポイントです。
- PersonalStorage.RootFolder – PST のルート FolderInfo を取得します。FolderInfo.AddSubFolder(name) でサブフォルダーを作成できます。FolderInfo.GetSubFolders() は子フォルダーを返すので、同名のフォルダーが既に存在するか確認できます。
- OlmStorage.GetFolders() – OLM のトップレベル OlmFolder コレクション(フォルダー階層)を返します。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 を削減することを検討してください。
結論
この記事では、C# と Aspose.Email for .NET を使用して、Outlook for Mac (OLM) ファイルを PST および MBOX 形式に変換する方法を学びました。OLM アーカイブの開封と処理、メッセージの抽出、フォルダー階層の保持を行いながら、データを新しいメールストレージ形式へエクスポートする手順を検討しました。Aspose.Email API を使用すれば、開発者はクロスプラットフォームのメール移行を簡単に自動化でき、Outlook for Mac、Outlook for Windows、そして Thunderbird のようなオープンソースクライアント間の互換性を確保できます。
詳細については、Aspose.Email documentation と API reference をご覧ください。
