BLOG

ブログ

2026/02/09 技術系

Microsoft Graph APIを使ってLaravelからメールを送る方法②

この記事を書いた人 K.M

こんにちは!
前回の記事では、LaravelからMicrosoft OAuth認証を行い、Microsoft Graph APIを使ってHTMLメールを送信する方法を紹介しました。
その中で最後に触れた通り、実運用ではアクセストークンの有効期限切れに対応する必要があります。
今回は続編として、リフレッシュトークンを使ったトークン更新処理を実装していきます。

なぜリフレッシュトークンが必要なのか

Microsoft Graph APIで取得できるアクセストークンは、有効期限が1時間と非常に短いです。
つまり、「認証できた」「メールが送れた」だけでは本番運用には不十分です。
そこで必要になるのがリフレッシュトークンです。

Microsoft OAuthのトークン構成

Microsoft OAuth認証後に取得できる主な値は以下です。

項目説明
access_tokenAPI呼び出しに使用
refresh_tokenアクセストークン更新用
expires_in有効期限(秒)
scope許可されたスコープ

リフレッシュトークンを使った更新処理

トークン更新用メソッドを作成します。
前回記事と同様、受け取ったアクセストークンなどの情報はキャッシュに保存しています。

public function refreshAccessToken(): void
{
    $refreshToken = Cache::get('ms_refresh_token');

    if (!$refreshToken) {
        throw new \Exception('リフレッシュトークンが見つかりません。');
    }

    $response = Http::asForm()->post(
        'https://login.microsoftonline.com/' .
        env('MICROSOFT_TENANT_ID') .
        '/oauth2/v2.0/token',
        [
            'client_id' => env('MICROSOFT_CLIENT_ID'),
            'client_secret' => env('MICROSOFT_CLIENT_SECRET'),
            'grant_type' => 'refresh_token',
            'refresh_token' => $refreshToken,
            'scope' => 'https://graph.microsoft.com/.default',
        ]
    );

    if ($response->failed()) {
        throw new \Exception('アクセストークンの更新に失敗しました。');
    }

    $data = $response->json();

    Cache::put(
        'ms_access_token',
        $data['access_token'],
        now()->addSeconds($data['expires_in'] - 60)
    );

    Cache::put('ms_refresh_token', $data['refresh_token']);
}

次に、以前作成したメール送信処理にトークン更新ロジックを組み込みます。

public function sendMail(): void
{
    $accessToken = Cache::get('ms_access_token');

    try {
        Http::withToken($accessToken)
            ->post('https://graph.microsoft.com/v1.0/me/sendMail', [
                'message' => [
                    'subject' => 'HTMLメールの件名',
                    'body' => [
                        'contentType' => 'HTML',
                        'content' => '<p>こんにちは!</p>',
                    ],
                    'toRecipients' => [
                        [
                            'emailAddress' => [
                                'address' => 'example@example.com'
                            ]
                        ],
                    ],
                ],
                'saveToSentItems' => true,
            ])
            ->throw();
    } catch (RequestException $e) {
     // アクセストークンの有効期限が切れていた場合更新を行う。
        if (!$retried && $e->response && $e->response->status() === 401) {
            app(MicrosoftTokenService::class)->refreshAccessToken();

            // メール再送
            $this->sendMail(true);
            return;
        }

        throw $e;
    }
}

これで、メール送信処理でアクセストークンの有効期限切れが発生した際に、自動でアクセストークンの更新処理を行えるようになりました。

※ リフレッシュトークンが失効した場合は、再度認証が必要となります。

まとめ

今回は、Laravel × Microsoft Graph APIにおいて、リフレッシュトークンを使ったアクセストークン更新処理を実装しました。
これで、アクセストークンの有効期限が切れた場合でも、自動で更新を行うため格段に使いやすくなると思います。
Microsoft Graph APIをLaravelで使う際の参考になれば幸いです。


株式会社ウイングドアは福岡のシステム開発会社です。
現在、私達と一緒に"楽しく仕事が出来る仲間"として、新卒・中途採用を絶賛募集しています!
ウイングドアの仲間達となら楽しく仕事できるかも?と興味をもった方、
お気軽にお問い合わせ下さい!

アーカイブ