Outlook ファイルの読み取りと変換

OST ファイルの操作

Aspose.Email for .NET は Microsoft Outlook OST ファイルを読み取るための API を提供します。OST ファイルをディスクまたはストリームからロードしてインスタンスに読み込むことができます。 Aspose.Email.Outlook.Pst.PersonalStorage フォルダー、サブフォルダー、メッセージなどの内容にアクセスするためのクラスです。Microsoft Outlook は、POP3 または IMAP メールサーバーを使用する際にメールを保存するために PST ファイルを作成します。対照的に、Microsoft Exchange がメールサーバーの場合は OST ファイルが作成されます。OST ファイルは PST ファイルよりも大きなサイズをサポートしています。

OST ファイルの読み取り

Aspose.Email を使用した OST ファイルの読み取り手順は、PST ファイルの読み取りとまったく同じです。同じコードで PST と OST の両方を読み取れます。正しいファイル名をクラスに提供するだけです。 PersonalStorage.FromFile() メソッド。以下のコードスニペットは OST ファイルの読み取り方法を示しています。

OST を PST に変換

Aspose.Email を使用すれば、1 行のコードで OST ファイルを PST に変換できます。同様に、同じコード行で PST ファイルから OST ファイルを作成することも可能です。 FileFormat 列挙子。現在、API は OST 形式を PST に変換することをサポートしていますが、2013/2016/2019/2021 以降のバージョンは除く。以下のコードスニペットは、OST を PST に変換する方法を示します。

OST ファイルで他の操作を行う場合は、以下のページをご参照ください:

PST を OST に変換

PST から OST への変換は Aspose.Email ではサポートされていません。OST はアカウントを追加しメールサーバーと同期すると Outlook が自動的に作成するためです。PST と OST の違いは、PST はローカルにのみ存在し、OST の内容はメールサーバー上にも存在します。そのため、ローカルで使用する目的で PST を OST に変換する必要はありません。ただし、Outlook のインポート/エクスポート ウィザードを使って PST を既存アカウントにインポートできます。

OLM は、Microsoft Outlook がローカルデータ(メール、添付ファイル、ノート、カレンダー情報、連絡先、タスク、履歴など)を保存するために使用する専用のファイル形式です。OLM ファイルは Outlook for Mac のみで使用でき、Windows 用 Outlook(PST 形式を使用)では開くこともアクセスすることもできません。

OLM ファイルの操作

OLM ファイルを開く

OLM 形式のファイルは 2 つの方法で開くことができます:

  • コンストラクタを使用する場合
  • 静的 FromFile メソッドを使用する場合

これらのメソッド間には動作の違いがあります。以下のセクションをご参照ください。

コンストラクタの使用

ファイルを開くには、以下のコンストラクタを呼び出します OlmStorage クラスに完全なファイル名またはストリームを引数として渡します:

var fileName = "MyStorage.olm";
var olm = new OlmStorage(fileName);

静的メソッド FromFile の使用

ファイルを開くには、静的メソッドを使用します FromFile そして、完全なファイル名またはストリームを引数として渡します:

var fileName = "MyStorage.olm";
var olm = OlmStorage.FromFile(fileName);

フォルダーの取得

OLM ファイルのディレクトリ構造にアクセスするには、以下のインスタンスを作成します OlmStorage クラスのコンストラクタでインスタンス化し、ファイルへのパスを渡します。ファイルが開かれたら、以下を使用してディレクトリ構造にアクセスします FolderHierarchy プロパティにアクセスしてください。このプロパティはリストを返します OlmFolder オブジェクトで、各々は OLM ファイル内のディレクトリを表します。ディレクトリ構造をさらに調査するには、 SubFolders 各オブジェクトのプロパティで、サブディレクトリのリストを返します。これらのプロパティを使用することで、OLM ファイル全体のディレクトリ階層をナビゲートし、含まれるすべてのディレクトリとサブディレクトリにアクセスできます。

以下の例は、階層順にすべてのフォルダーの一覧を表示します:

using (var olm = new OlmStorage(fileName))
{
    PrintAllFolders(olm.FolderHierarchy, string.Empty);
}

private void PrintAllFolders(List<OlmFolder> folderHierarchy, string indent)
{
    foreach (var folder in folderHierarchy)
    {
        Console.WriteLine($"{indent}{folder.Name}");
        PrintAllFolders(folder.SubFolders, indent+"-");
    }
}

使用時は FromFile メソッドは OLM ファイルを開き、 FolderHierarchy プロパティはデフォルトでは初期化されず、null を返します。この場合、GetFolders メソッドを明示的に呼び出して初期化してください。 FolderHierarchy プロパティを使用して OLM ファイル内のディレクトリ一覧を取得します:

using (var olm = OlmStorage.FromFile(fileName))
{
    var folders = olm.GetFolders();
}

また、名前で任意のフォルダーを取得することも可能です:

  1. 呼び出す GetFolder メソッド。
  2. 最初の引数にフォルダー名を渡し、2 番目のパラメータにはフォルダー検索時に大文字小文字を無視するかどうかを示す値を渡します。
using (var olm = OlmStorage.FromFile(fileName))
{
    // get inbox folder by name
    OlmFolder folder = olm.GetFolder("Inbox", true);
}

メールの一覧

OlmFolder クラスはフォルダーを表し、メール一覧を取得するための次のメソッドを持ちます。

  • EnumerateMessages フォルダー内のメールの反復処理を実装します。この場合、各反復は以下を返します OlmMessageInfo メールに関する簡易情報を提供するオブジェクトです。
  • EnumerateMapiMessages、フォルダー内のメールの反復処理も実装していますが、この場合、各反復は以下を返します MapiMessage メール自体を表すオブジェクトで、すべてのプロパティを持ちます。

EnumerateMessages メソッドの使用

using (var olm = OlmStorage.FromFile(fileName))
{
    var folder = olm.GetFolder("Inbox", true);
    foreach (var messageInfo in folder.EnumerateMessages())
    {
        Console.WriteLine(messageInfo.Subject);
    }
}

EnumerateMapiMessages メソッドの使用

using (var olm = OlmStorage.FromFile(fileName))
{
    var folder = olm.GetFolder("Inbox", true);

    foreach (var msg in folder.EnumerateMapiMessages())
    {
        // save message in MSG format
        msg.Save($"{msg.Subject}.msg");
    }
}

その他の便利なプロパティ

OlmFolder クラスの他の便利なプロパティは次のとおりです: HasMessages および MessageCount プロパティは、フォルダー内のメッセージの有無とその数を返します。

using (var olm = OlmStorage.FromFile(fileName))
{
    var folder = olm.GetFolder("Inbox", true);

    if (folder.HasMessages)
    {
        Console.WriteLine($"Message count: {folder.MessageCount}");
    }
}

メッセージの更新日時の取得または設定

修正日付は OLM メッセージが最後に修正された日時を表します。これを使用して OlmMessageInfo.ModifiedDate OLM メッセージの修正日付値を取得または更新するプロパティです。

以下はプロパティの使用例です:

foreach (OlmMessageInfo messageInfo in inboxFolder.EnumerateMessages())
{
   DateTime modifiedDate = messageInfo.ModifiedDate;
}

メールとアイテムの抽出

OlmStorage クラスには ExtractMapiMessage メールを抽出できるメソッドです。このメソッドは OlmMessageInfo オブジェクト。

using (var olm = OlmStorage.FromFile(fileName))
{
    var folder = olm.GetFolder("Inbox", true);

    foreach (var messageInfo in folder.EnumerateMessages())
    {
        if (messageInfo.Date == DateTime.Today)
        {
            // Extracts today's messages form Inbox
            var msg = olm.ExtractMapiMessage(messageInfo);
        }
    }
}

Traversal API の使用

元ファイルの一部が破損していても例外をスローせず、可能な限り Outlook OLM ファイルからすべての項目を抽出できます。これを行うには、次を使用します。 OlmStorage(TraversalExceptionsCallback callback) コンストラクターと Load(string fileName) FromFile メソッドの代わりにこのメソッドを使用します。コンストラクタでコールバックメソッドを定義できます。

using (var olm = new OlmStorage((exception, id) => { /* Exception handling  code. */ }))

コールバックメソッドにより、ロードおよびトラバーサル時の例外が取得可能になります。

この Load メソッドは、ファイルが正常にロードされ、さらに走査可能な場合に ’true’ を返します。ファイルが破損して走査できない場合は ‘false’ が返されます。

if (olm.Load(fileName))

以下のコードスニペットと手順は、この API の使用方法を示しています。

  1. 新しいインスタンスを作成します OlmStorage クラスに例外処理コールバックを渡し、処理中に発生した例外を処理します。
  2. 次の呼び出しで OLM ファイルをロードします。 Load OlmStorage インスタンスのメソッドです。
  3. OLM ファイルが正常にロードされた場合、次のメソッドを呼び出してフォルダー階層を取得します。 GetFolders OlmStorage インスタンスのメソッドです。これにより OlmFolder オブジェクトのリストが返されます。
  4. OlmStorage インスタンスと OlmFolder オブジェクトのリストを渡して、ExtractItems メソッドを呼び出します。
  5. ExtractItems メソッド内で、folders リストの各フォルダーをイテレートします。
  6. フォルダーにメッセージ(メール)が含まれている場合、Console.WriteLine(folder) を使用してフォルダー名をコンソールに出力します。
  7. OlmStorage インスタンスの EnumerateMessages メソッドを呼び出し、現在のフォルダーを引数として渡すことで、現在のフォルダー内のメッセージをイテレートします。
  8. Console.WriteLine(msg.Subject) を使用して、各メッセージの件名をコンソールに出力します。
  9. フォルダーにサブフォルダーがある場合、OlmStorage インスタンスと現在のフォルダーのサブフォルダーを渡して、ExtractItems メソッドを再帰的に呼び出します。
using (var olm = new OlmStorage((exception, id) => { /* Exception handling  code. */ }))
{
    if (olm.Load(fileName))
    {
        var folderHierarchy = olm.GetFolders();
        ExtractItems(olm, folderHierarchy);
    }
}

private static void ExtractItems(OlmStorage olm, List<OlmFolder> folders)
{
    foreach (var folder in folders)
    {
        if (folder.HasMessages)
        {
            Console.WriteLine(folder);

            foreach (var msg in olm.EnumerateMessages(folder))
            {
                Console.WriteLine(msg.Subject);
            }
        }

        if (folder.SubFolders.Count > 0)
        {
            ExtractItems(olm, folder.SubFolders);
        }
    }
}

識別子によるメッセージ抽出

場合によっては、識別子で選択されたメッセージを抽出する必要があります。たとえば、アプリケーションがデータベースに識別子を保存し、必要に応じてメッセージを抽出します。これは、毎回ストレージ全体を走査して特定のメッセージを探す手間を省く効率的な方法です。この機能は OLM ストレージで利用可能です。 EntryId プロパティ( OlmMessageInfo クラスはメッセージエントリ識別子を取得します。オーバーロードされた ExtractMapiMessage(string id) メソッド( OlmStorage クラスは OLM からメッセージを取得します。

以下のコードは、識別子で OLM からメッセージを抽出する方法を示します。

コードは以下の手順を実行します:

  1. foreach ループを開始して、リストを反復します: OlmMessageInfo オブジェクト。ループはこれを使用します: EnumerateMessages olmFolder オブジェクトのメソッドで、反復中の現在のフォルダー内のすべてのメッセージのリストを取得します。
  2. ループは、以下を呼び出すことでストレージから対応する MapiMessage オブジェクトを抽出します: ExtractMapiMessage(string id) メソッド OlmStorage クラス、渡すのは EntryId 現在のメッセージをパラメータとして

取得した MapiMessage オブジェクトは、メッセージの内容にアクセスし操作するために使用できます。ループはフォルダー内のすべてのメッセージが処理されるまで続きます。

  foreach (OlmMessageInfo msgInfo in olmFolder.EnumerateMessages())
  {
      MapiMessage msg = storage.ExtractMapiMessage(msgInfo.EntryId);
  }

フォルダーパス取得

OLM ファイル内のフォルダーのパスも取得できます。Aspose.Email は以下を提供します OlmFolder.Path フォルダー パスを返すプロパティです。以下のコードスニペットは、使用例を示します。 OlmFolder.Path OLM ファイル内のフォルダー パスを取得するプロパティ。

var storage = new OlmStorage("SampleOLM.olm");
PrintPath(storage, storage.FolderHierarchy);

public static void PrintPath(OlmStorage storage, List<OlmFolder> folders)
{
    foreach (OlmFolder folder in folders)
    {
        // print the current folder path
        Console.WriteLine(folder.Path);

        if (folder.SubFolders.Count > 0)
        {
            PrintPath(storage, folder.SubFolders);
        }
    }
}

フォルダー内項目数をカウント

フォルダー内の項目数をカウントすることもできます。Aspose.Email は以下を提供します OlmFolder.MessageCount フォルダー内の項目数を返すプロパティです。以下のコードスニペットは、使用例を示します。 OlmFolder.MessageCount OLM ファイルのフォルダー内の項目数を取得するプロパティ。

var storage = new OlmStorage("SampleOLM.olm");
PrintMessageCount(storage.FolderHierarchy);

public static void PrintMessageCount(List<OlmFolder> folders)
{
    foreach (OlmFolder folder in folders)
    {
        Console.WriteLine("Message Count [" + folder.Name + "]: " + folder.MessageCount);
    }
}

OlmStorage の総アイテム数を取得する

OlmStorage クラスにはさらに GetTotalItemsCount() OLM ストレージに含まれるメッセージ項目の総数を返すメソッドです。

  using (var olm = new OlmStorage("storage.olm"))
  {
     var count = olm.GetTotalItemsCount();
  }

Outlook カテゴリ色の取得

OLM ファイルに保存されたカテゴリ色または Outlook アイテムカテゴリを操作するために、Aspose.Email は以下のソリューションを提供します:

  • OlmItemCategory クラス - 名前と 16 進数形式で表された関連色で利用できる Outlook アイテムカテゴリを表します。
  • GetCategories() メソッド( OlmStorage クラス - カテゴリ一覧を取得します。

以下のコードサンプルは、OML ストレージから使用されているすべてのカテゴリを取得する方法を示します:

using (var olm = OlmStorage.FromFile("storage.olm"))
{
    var categories = olm.GetCategories();
    
    foreach (var category in categories)
    {
        Console.WriteLine($"Category name: {category.Name}");
        
        //Color is represented as a hexadecimal value: #rrggbb
        Console.WriteLine($"Category color: {category.Color}");
    }
}

以下のコードサンプルは、メッセージカテゴリの色を取得する方法を示します:

foreach (var msg in olm.EnumerateMessages(folder))
{
    if (msg.Categories != null)
    {
        foreach (var msgCategory in msg.Categories)
        {
            Console.WriteLine($"Category name: {msgCategory}");
            var categoryColor = cat.First(c => c.Name.Equals(msgCategory, StringComparison.OrdinalIgnoreCase)).Color;
            Console.WriteLine($"Category color: {categoryColor}");
        }
    }
}

OLM を PST に変換

OLM Microsoft Outlook for Mac システムで使用されるデータベース ファイル形式です。OLM ファイルはメールメッセージ、カレンダー データ、連絡先データ、アプリケーション設定を保存します。OLM ファイルは Windows 用 Outlook ではサポートされていません。そのため、Outlook for Mac(OLM)ファイルを Windows 用 Outlook で開くことはできません。Outlook for Mac から Windows 用 Outlook にメールボックスを移行したい場合は、Mac 用 OLM ファイルを Outlook PST ファイル形式に変換する必要があります。

コード手順

以下の手順に従って OLM ファイルを PST に変換します:

  1. インスタンスを作成する OlmStorage ソース OLM を開くクラスです。
  2. ソース OLM ファイルを開きます。
  3. 次を使用して新しい PST ファイルを作成します: Create メソッド。
  4. メッセージクラスをフォルダークラスにマッピングする GetContainerClass メソッドを作成します。
  5. EnumerateMapiMessages メソッドを使用して OLM から各フォルダーとそのメッセージを再帰的に読み取り、AddSubFolder と AddMessage メソッドを使用して同じ順序で PST に追加する AddToPst メソッドを作成します。

コードサンプル

以下のコードサンプルは、OLM を PST に変換する方法を示します。

Main メソッド:

// create an instance of OlmStorage class to open source OLM
using (var olm = new OlmStorage("my.olm"))
// create a new PST file
using (var pst = PersonalStorage.Create("my.pst", FileFormatVersion.Unicode))
{
    // recursively reads each folder and its messages 
    // and adds 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);
    }
}