[Microsoft Graph API+PHP]フォルダ内にある特定名のサブフォルダのIDを取得する

PHP

お疲れ様です。すぺきよです。

Microsoft Graph APIを利用して、OutLookのメールを操作することがあり、目的別に関数を作ったので、備忘録としてメモしておきます。

今回は、指定したフォルダ内にあるサブフォルダのIDを取得する関数です。

Microsoft Graph APIとは何かについては、公式を確認してください。私が改めてまとめるより、そちらの方が間違いありません。

また、使う言語は、タイトルにもありますが、PHPです。

各種バージョン

composerでインストールされている各モジュールのバージョンは以下のとおりです。

microsoft/microsoft-graph

2.1

vlucas/phpdotenv

5.6

前提条件

事前にPHP向けのアプリ構築のチュートリアルとして、「Microsoft Graph を使って PHP アプリを構築する」をもとに、アプリの登録や、GraphHelperクラスを実装してください。

そして、実装した「GraphHelperクラス」に、以下のコードを追加して、privateでインスタンス内に所有している「$userClient」を公開し、外部からも利用できる様にしてください。

    public static function getUserClient()
    {
        return self::$userClient;
    }

この部分については、好みが分かれると思います。

この変数を公開しないと、「GraphHelperクラス」にどんどん機能を追加していくことになり、クラスの肥大化につながります。

そうなると、クラスの使い回しがしづらいため、外部に公開することにしています。

外部公開に否定的な場合は、適宜コードを読み替えたり、コードを各場所を変更してください。

実際のコード

指定したフォルダのサブフォルダの一覧を取得し、その一覧を上から順にチェックしていき、一致するフォルダ名があった場合はそのフォルダのIDを取り出して返すというコードです。

もし一致した名称のサブフォルダが見つからなかった場合は例外を投げます。

以下の「getChildFolderIdWithDisplayName」関数が今回紹介したいコードになります。

<?php
require_once realpath(__DIR__ . '/../composer/vendor/autoload.php');
require_once 'GraphHelper.php';

use Microsoft\Graph\Generated\Models;

main();
exit(0);

function loadDotEnv()
{
    // Load .env file
    $dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
    $dotenv->load();
    $dotenv->required(['CLIENT_ID', 'TENANT_ID', 'GRAPH_USER_SCOPES']);
}

function main()
{
    loadDotEnv();

    GraphHelper::initializeGraphForUserAuth();

    echo getChildFolderIdWithDisplayName("inbox", "サブフォルダ名");
}

/**
 * 指定されたメールの親ID内に含まれる子供フォルダから名前が第二引数に指定される名称のフォルダを探し出し、そのIDを返却する
 *
 * @param string $parent_id   親ID、受信トレイを指定する場合は"inbox"を指定する
 * @param string $folder_name 探し出す子供のフォルダの名称
 * @return string 見つかった子供フォルダのID
 */
function getChildFolderIdWithDisplayName(string $parent_id, string $folder_name) : string
{
    /** @var Models\MailFolderCollectionResponse $results */
    $results = GraphHelper::getUserClient()->me()->mailFolders()->byMailFolderId($parent_id)->childFolders()->get()->wait();

    /** @var array $mail_folder_list */
    $mail_folder_list = $results->getValue();

    /** @var Models\MailFolder $child_folder_item */
    foreach($mail_folder_list as $child_folder_item)
    {
        $display_name = $child_folder_item->getDisplayName();
        if(strcmp($display_name, $folder_name) === 0)
        {
            return $child_folder_item->getId();
        }
    }

    throw new Exception("指定された名称のフォルダーは見つかりませんでした。");
}

ここで取得できたIDを仮に「XXXXXXXXXX」とすると、Microsoft Graph Explorerで以下の様に入力を行い、「Run Query」をクリックすると、今回指定したフォルダの情報が表示されるはずです。

また、以下の様に、URLの末尾に「/messages」をつけると、そのフォルダに入っているメッセージの一覧を表示してみることが可能です。

第一引数の$parent_idには何を指定するか

ここで困るのが、getChildFolderIdWithDisplayName関数の第一引数に最初に指定するべきIDを何にすればいいかということだと思います。

これについては、Microsoft Graph APIの「mailFolder resource type」のページを参照し、「Well-known folder names」の項目を参照します。

ここによく知られたフォルダの一覧として、「inbox」や「draft」、「deleteditems」などの名称が一覧で明記されています。

ここでいう「inbox」は「受信トレイ」フォルダを示し、「draft」は「下書き」フォルダを示すなど、最初からあるフォルダなどの名称が一覧で記載されています。

この「inbox」や「draft」、「deleteditems」などの名称は、そのまま$parent_idに指定することが可能です。

目的に合わせて、$parent_idを指定してください。

もちろん、今回取得したフォルダのIDを親に指定することで、サブフォルダの中のサブフォルダの中のサブフォルダの・・・と下のフォルダのIDを順番に取得することも可能でしょう。

これができると何が嬉しいのか

今回はサブフォルダのIDを取得してみました。

ただ、これだけでは、ほぼ何も意味はありません。

今後、特定のフォルダの中のメールにアクセスするとか、メールを特定のフォルダに移動するなどの操作を行う際にこのIDが必要になってきます。

参考資料

タイトルとURLをコピーしました