[Microsoft Graph API+PHP]Outlookに届いたメールの詳細をプログラムで読み取る

PHP

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

前回前々回に引き続き、PHPとMicrosoft Graph APIを使ってOutlookから情報を読み取り処理する方法です。

今回は、前回取得できたメールを一意に示すIDを使って、メールの詳細な情報を取得する方法をまとめます。

今回の例では「件名」「本文」「送信日時」「受信日時」「送信者メールアドレス」「送信者名」のそれぞれを取得します。

各種バージョン

前回以前と同じですが、こちらにも書いておきます。

microsoft/microsoft-graph

2.1

vlucas/phpdotenv

5.6

前提条件

こちらも前回以前と同じです。

以下のコードを、GraphHelperクラスに追加するところまで行ってください。

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

実際のコード

既知となっているメールを一意に示すIDが指し示すメールの本文などの詳細情報を取得する実際のコードです。

今回はよく使うであろう代表的な情報を取得します。

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

<?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();

    $mail_id = "XXXXX...XXXXX="; //ここの引数に既知のメールIDをセット
    $results = getMailDetails($mail_id);
    var_dump($results);
}

/**
 * 指定されたメッセージIDを持つメッセージの詳細を読み取る
 *
 * @param string $one_mail_id 読み取りたいメールのID
 * @return array 読み取ったデータ 以下のキーに対して、値を持つ
 *      subject : 件名
 *      from_name : 送信者名
 *      from_address : 送信元アドレス
 *      body : メール本文
 *      sent_at : メール送信日時
 *      received_at : メール受信日時
 */
function getMailDetails(string $one_mail_id) : array
{
    /** @var Models\Message $message_item */
    $message_item = GraphHelper::getUserClient()->me()->messages()->byMessageId($one_mail_id)->get()->wait();

    /** @var Models\Recipient $from_item */
    $from_item = $message_item->getFrom();
    
    /** @var Models\EmailAddress $from_email_item */
    $from_email_item = $from_item->getEmailAddress();
    
    $from_mail_address = $from_email_item->getAddress();
    $from_mail_name = $from_email_item->getName();

    /** @var Models\ItemBody $body_item */
    $body_item = $message_item->getBody();

    $mail_body_raw = $body_item->getContent();

    //改行が \r\nの文字列になっているので、改行に置換する
    $mail_body = preg_replace("#(\\\\r\\\\n|\\\\r|\\\\n)#", "\n", $mail_body_raw);

    $sent_at = $message_item->getSentDateTime();
    $received_at = $message_item->getReceivedDateTime();
    
    return ["subject" => $message_item->getSubject(), "from_name" => $from_mail_name, "from_address" => $from_mail_address, "body" => $mail_body, "sent_at" => $sent_at, "received_at" => $received_at];
}

詳細な情報を読み取りたい既知のメールIDは24行目の「$mail_id」にセットします。

処理に成功すると、26行目の「var_dump($results);」によって、取得できたメールの詳細な情報の一部を以下の様に標準出力に出力します。

array(6) {
  ["subject"]=>
  string(9) "test mail"
  ["from_name"]=>
  string(8) "supekiyo"
  ["from_address"]=>
  string(28) "spekiyo@kono.address.ha.kari"
  ["body"]=>
  string(31) "this mail is test
new line test"
  ["sent_at"]=>
  object(DateTime)#202 (3) {
    ["date"]=>
    string(26) "2024-01-01 00:00:00.000000"
    ["timezone_type"]=>
    int(2)
    ["timezone"]=>
    string(1) "Z"
  }
  ["received_at"]=>
  object(DateTime)#201 (3) {
    ["date"]=>
    string(26) "2024-01-01 00:01:23.000000"
    ["timezone_type"]=>
    int(2)
    ["timezone"]=>
    string(1) "Z"
  }
}

どの出力がどのデータであるかは29行目〜40行目の関数のコメントを見ていただければ分かると思います。

他にはどの様な情報が取得できるのか

今回は件名やメール本文、送信日など、よく使いそうな情報のみをピックアップして取得しました。

しかし、必要に応じてもっと別の情報(CCやBCCアドレスの情報や既読フラグ、ユーザーが設定したfollowUpFlagなど)が欲しいかもしれません、

そんな時は「メッセージ リソースの種類のプロパティ」を参照してください。

44行目で取得できる「$message_item」をdumpして内容を確認してもいいですが、出力内容が多く、情報を探しづらいので、APIリファレンスを見たほうがいいでしょう。

PHPで情報の取得関数を作成するときは、だいたいプロパティの一文字目を大文字にして、その前に「get」をつければ取得できるようです。

実際の関数名はリファレンスとしてまとめられているものが見つからなかったので、ソースから探す必要がありそうです。

それぞれのソースは、以下のgitで公開されています。

Models\Message」「Models\Recipient」「Models\EmailAddress」「Models\ItemBody

関数が返却するたいの中には、fromやbodyの様に単なる文字列ではなく、インスタンスが返ってくることもあります。

これも、「メッセージ リソースの種類のプロパティ」からリンクで飛べる様にしてくれていますので、詳細を順番に確認できます。

最後に

今回は一件のメールの詳細な情報を取得する方法を紹介しました。

前回や前々回の内容と組み合わせることで、フォルダ内の特定の件名や送信元アドレスのメールの内容をテキストデータにまとめて提出するときなどに使えると思います。

その他、メール送信処理のテストを自動化する時などにも使えるとおもます。

「Microsoft Graph APIを使ってこんなことがしたいんだけどやり方がわからない。」などあれば、問い合わせフォームからご質問ください。

全てにお答えできるわけではありませんが、分かる範囲で調べて、記事にまとめてみたいと思います。

参考URL

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