OLM から PST への変換

OLM は Microsoft Outlook for Mac が使用するデータベース形式です。OLM ファイルはメールメッセージ、カレンダーデータ、連絡先、アプリ設定を保存しますが、Windows 用 Outlook ではサポートされていません。Mac 用 Outlook から Windows 用 Outlook にメールボックスを移行するには、OLM ファイルを Outlook の PST 形式です。Aspose.Email for .NET を使用すれば、Microsoft Outlook をインストールせずにコードだけで実行できます。

変換の仕組み

OLM ファイルを PST に変換する手順は次のとおりです:

  1. インスタンスを作成します OlmStorage ソース OLM ファイルを開くクラス。
  2. 以下を使用して新しい PST ファイルを作成します PersonalStorage.Create メソッド。
  3. 実装する GetContainerClass メソッドはメッセージクラスを対応するフォルダー(コンテナ)クラスにマッピングし、各フォルダーが PST 内で正しいタイプで作成されるようにします。
  4. 実装する AddToPst メソッドで、OLM ファイルから各フォルダーとメッセージを再帰的に読み取ります - 使用するのは EnumerateMapiMessages - そして同じ順序で PST に追加します。使用するのは AddSubFolder および AddMessage のメソッド FolderInfo.

コードサンプル

以下のコードは OLM ファイルを PST に変換する方法を示します。

Main メソッド:

// create an instance of OlmStorage class to open the source OLM
using (var olm = new OlmStorage("my.olm"))
// create a new PST file
using (var pst = PersonalStorage.Create("my.pst", FileFormatVersion.Unicode))
{
    // recursively read each folder and its messages
    // and add them to the PST in the same order
    foreach (var olmFolder in olm.FolderHierarchy)
    {
        AddToPst(pst.RootFolder, olmFolder);
    }
}

GetContainerClass メソッド:

public string GetContainerClass(string messageClass)
{
    if (messageClass.StartsWith("IPM.Contact") || messageClass.StartsWith("IPM.DistList"))
    {
        return "IPF.Contact";
    }

    if (messageClass.StartsWith("IPM.StickyNote"))
    {
        return "IPF.StickyNote";
    }

    if (messageClass.StartsWith("IPM.Activity"))
    {
        return "IPF.Journal";
    }

    if (messageClass.StartsWith("IPM.Task"))
    {
        return "IPF.Task";
    }

    if (messageClass.StartsWith("IPM.Appointment") || messageClass.StartsWith("IPM.Schedule.meeting"))
    {
        return "IPF.Appointment";
    }

    return "IPF.Note";
}

AddToPst メソッド:

public void AddToPst(FolderInfo pstFolder, OlmFolder olmFolder)
{
    FolderInfo pstSubFolder = pstFolder.GetSubFolder(olmFolder.Name);

    foreach (var msg in olmFolder.EnumerateMapiMessages())
    {
        if (pstSubFolder == null)
        {
            pstSubFolder = pstFolder.AddSubFolder(olmFolder.Name, GetContainerClass(msg.MessageClass));
        }

        pstSubFolder.AddMessage(msg);
    }

    if (pstSubFolder == null)
    {
        pstSubFolder = pstFolder.AddSubFolder(olmFolder.Name);
    }

    foreach (var olmSubFolder in olmFolder.SubFolders)
    {
        AddToPst(pstSubFolder, olmSubFolder);
    }
}