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 token | Gmail APIを実際に呼び出すための短期トークン |
| refresh token | access 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
→ 対象
→ 公開ステータス
ここが次のようになっていれば、本番環境です。
公開ステータス:本番環境
画面に 「テストに戻る」 ボタンが表示されている場合、それは現在が本番環境であることを意味します。
このボタンは押してはいけません。
コメントを残す