WordPress : OAuth 2.0になってから設定がトリッキーになった~Gmail送信が7日後に止まる原因と対策~

FluentSMTP / WP Mail SMTP / Post SMTPで必要だった「In production化」と再接続

WordPressサイトからGmailを使ってメール送信していると、ある日突然メールが送れなくなることがあります。

特に、FluentSMTP、WP Mail SMTP、Post SMTPなどでGmail API連携を使っている場合、次のような現象が起きることがあります。

・最初はGmail送信に成功する
・しかし約7日後に送信できなくなる
・再認証するとまた送れる
・しかし再び約7日後に切れる

今回、実際にこの現象を確認し、原因が Google Cloud側のOAuth公開ステータスWordPressプラグイン側の再接続不足 にあることが分かりました。


結論:7日後に切れる原因はaccess tokenではなくrefresh token

Gmail APIでは、OAuth 2.0という認証方式が使われます。

ここで重要なのは、次の2種類のトークンです。

種類役割
access tokenGmail APIを実際に呼び出すための短期トークン
refresh tokenaccess tokenを再発行するための長期トークン

access tokenは短時間で期限切れになる前提のものです。
通常、SMTPプラグインはrefresh tokenを使ってaccess tokenを自動更新します。

したがって、access tokenが期限切れになること自体は正常です。

問題は、Google CloudのOAuthアプリが Testing / テスト中 のままだと、refresh token自体が7日で失効する場合があることです。Google Ads APIの公式エラー説明でも、Googleプロジェクトの公開ステータスがTestingの場合、refresh tokenが7日で失効し、invalid_grant が発生するため、公開ステータスを In production に変更するよう案内されています。


発生したエラー例

今回確認したエラーの一例 (WP Mail SMTP: メール送信のエラー関連)は以下です。

{
"error": {
"code": 401,
"message": "Request is missing required authentication credential.",
"status": "UNAUTHENTICATED",
"details": [
{
"reason": "CREDENTIALS_MISSING",
"service": "gmail.googleapis.com"
}
]
}
}

このエラーは、Gmail APIに送信リクエストを出す際に、有効な認証情報、つまり有効なaccess tokenが付いていないことを示します。

ただし、根本原因はaccess tokenそのものではなく、refresh tokenが失効してaccess tokenを再取得できなくなっていることである可能性が高いです。


なぜ7日で切れるのか

Google CloudのOAuth同意画面には、公開ステータスがあります。

主に以下の2つです。

公開ステータス意味
Testing / テスト中開発・検証中の状態
In production / 本番環境継続利用する状態

OAuthアプリがTestingのままだと、テストユーザーのみがアクセスできる状態になり、refresh tokenが7日で失効することがあります。

Stack Overflowでも、TestingからProductionへ変更するとrefresh tokenの7日失効が止まるという事例が報告されています。

つまり、7日ごとにGmail送信が止まる場合、次のような構造になっている可能性があります。

Google CloudのOAuthアプリがTesting状態

WordPress SMTPプラグインでGmail認証

refresh tokenが発行される

7日後にrefresh tokenが失効

access tokenを再取得できない

Gmail送信不可

対策の全体像

対策は、単にGoogle Cloud側を本番環境にするだけでは不十分でした。

重要なのは、次の2つをセットで行うことです。

1. Google Cloud側でOAuthアプリを本番環境にする
2. WordPress SMTPプラグイン側でGmail接続を削除し、再接続する

Google CloudをIn productionにしても、WordPress側にTesting時代の古いrefresh tokenが残っていると、再び7日後に切れる可能性があります。

そのため、既存接続を削除して、Google認証をやり直すことが必要です。


手順1:Google Cloudで公開ステータスを確認する

Google Cloud Consoleで対象プロジェクトを開きます。

Google Cloud Console
→ Google Auth Platform
→ 対象
→ 公開ステータス

ここが次のようになっていれば、本番環境です。

公開ステータス:本番環境

画面に 「テストに戻る」 ボタンが表示されている場合、それは現在が本番環境であることを意味します。
このボタンは押してはいけません。


人気順

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA