GmailAPIのOAuthを使ってメールを送る方法


OAuth認証を利用する理由

以前、SMTPを使ってメールを送信する方法を紹介しました。

メールサーバーにGoogleのサーバーを利用している方も多いと思います。
今回はGmailAPIとOAuth認証を使ってよりセキュリティの高いメールの送信方法を紹介します。
OAuth認証を使ったメールの送信はGoogleに限らず他のメールサーバーでも用意されているところはありますので、ぜひ使ってみてください。

上記で紹介したSMTPを使ったメール送信では1つ課題があります。
それは、メール送信のプログラムにメールアカウントを設定する必要があるということです。
メールのアカウント情報は基本的には第三者に知られてはいけません
第三者が知ってしまうと、それを使ってあなたになりすましてメールを送ることができてしまいますよね。
とはいえ、プログラムに入れる必要があるので、以前紹介した方法でメールを送る場合には、開発者である第三者にアカウント情報を教えないといけないということになりますが、それではセキュリティ上あまり好ましくないので、今回紹介するOAuth認証という方法を使います。

具体的には、メールアカウントに紐づいた認証情報(OAuth)を発行して使います。
認証情報は追加や削除が可能で、いつでも停止することができますが、その際にメールアカウントには影響を及ぼしません。
なので、発行した情報で不正が発覚した場合は直ちに停止ができ、必要な場合は別の内容で再発行が可能です。

これまでは

メールアカウントで認証 → SMTPで送信

でしたが、

OAuthで認証 → SMTPで送信

という方法で送信します。

OAuth認証を利用したコード

では、早速OAuth認証を使ったメール送信のコードを紹介します。
今回もPHPMailerを使った方法になります。
以前の

をベースに、OAuthのコードを追加して利用します。
以下のコードを追加して使います。

// Google OAuthプロバイダのインスタンスを作成
$provider = new Google(
    [
        'clientId' => 'クライアントID',          // Google Cloud Platformで取得したクライアントID
        'clientSecret' => 'クライアントシークレット', // Google Cloud Platformで取得したクライアントシークレット
    ]
);

// PHPMailerのOAuth設定
$phpmailer->setOAuth(
    new OAuth(
        [
            'provider' => $provider,                    // 上で作成したGoogle OAuthプロバイダのインスタンス
            'refreshToken' => 'リフレッシュトークン',   // 事前に取得しておく必要があるリフレッシュトークン
            'userName' => '認証メールアドレス',         // 認証に使用したGMailアドレス
        ]
    )
);


説明はコメントを入れているので、それを参考にしてください。
コードこのような感じで設定するのですが、今回新しく設定する内容の中に、

  • クライアントID
  • クライアントシークレット
  • リフレッシュトークン

の新たに3つの情報が必要になります。
これらを取得してみましょう。

クライアントID、クライアントシークレットの取得

では、まずは3つの情報のうちの2つ、
クライアントID、クライアントシークレットを取得しましょう。
こちらは比較的簡単に取得することができます。

Gmail APIの有効化

  • Google Cloud Platformへログインします。
  • 左メニューの「APIとサービス」を選択します。
  • 「APIとサービスの有効化」をクリック
  • APIがたくさん出てくるので、「gmail」で検索して「Gmail API」を見つける
  • 「Gmail API」を有効化する

OAuth同意画面の設定

初回の場合、OAuth同意画面の設定が必要になるかもしれません。
画面のメニューからや、必要な場合は自動で誘導されることもあります。

以下の画像のように、それぞれ設定を行ってください。
OAuth同意画面については設定の定義が私もあいまいで、間違っている部分もあるかもしれません。
動作するために設定した結果として紹介しますが、最適な設定にはなっていない可能性があります。

まずは、UserTypeを設定します。
内部の設定は未検証です。私は外部に設定しています。

次に、アプリの情報の設定です。
赤い欄を入力してください。
アプリ名は任意で、連絡先はメールアドレスを入力してください。

この後も2,3回入力フォームが続きますが、
「保存して次へ」を選んで進んでください。

最後に、ダッシュボードに戻った際には、「アプリを公開」にして次へ進みましょう。

OAuth認証情報を設定

次に認証情報を実際に取得する手順に進みます。

  • 「認証情報」をクリック
  • 「OAuthクライアントID」をクリック
  • 入ってすぐに「ウェブアプリケーションを選択」
  • 下に表示される各入力欄に入力
    名前:任意の名前
    承認済みのリダイレクトURI:https://developers.google.com/oauthplayground

上の画面を見てわかるように、設定を完了すると右側にクライアントIDとクライアントシークレットが表示されるので、これを控えておきましょう。
初回では設定後に次のような画面が現れるので、ここに記載されています。
これで、まずは必要な情報のうち2つを取得できました。

このようにOAuthのIDはいくつも作ることができます。
いつでも停止出来ていつでも新しく発行できるというのは、仮に提供したIDが不正なことに使用された場合でも、IDを停止することですぐに被害を防げます
これがOAuthを利用するメリットの1つで、セキュリティ上重要なことです。

リフレッシュトークンの取得

次に、残りのリフレッシュトークンの取得について紹介しましょう。
このリフレッシュトークンの取得が、いろいろと調べたところやり方が様々で、プログラムがわからなくても理解できる一番シンプルであろう方法を紹介します。

OAuth 2.0 Playgroundのページを使います。

Playgroundのページに入ったら、

  • 右上の設定ボタン
  • Use your own OAuth credentialsにチェック
  • 「クライアントID」「クライアントシークレット」を入力

次に、左側のStep1~3を設定しましょう。
今回はStep2までしか使いません。

Gmailでメールを送るために、一覧からGmailに関する2つのチェックをします。
チェックをしたら「Authorize APIs」をクリックしてください。

「Authorize APIs」をクリックするといつもの認証画面が出てきます。
ここで本人による認証を行うことで、OAuthが認証されたものとして発行されます。

認証するアカウントを選択して次へ進むと、エラーっぽい画面が出てきますが、
左下の詳細から、(安全ではないページ)に移動してください。

さらに、次の画面で承認を行ってください。

ようやく、Step2へ進みます。
Step2で「Exchange authorization code for tokens」をクリックすると、
ようやく「Refresh token」の欄にリフレッシュトークンが現れます。
この文字列を控えてください。
「Exchange authorization code for tokens」をクリックすると、自動的にStep3に進むことがあります。
Step2が閉じられてStep3が開いた状態になることがあるので、その場合はStep2をクリックしてアコーディオンを開いて戻ってください。

これでようやく3つの情報が揃いましたね。

  • クライアントID
  • クライアントシークレット
  • リフレッシュトークン

前回紹介したSMTPによるメール送信と組み合わせて、
次のようなコードで該当箇所に取得した情報を設定しましょう。
認証メールアドレスは、上で認証したGoogleアカウントのメールアドレスになります。

// SMTP設定
$phpmailer = new PHPMailer(true);
$phpmailer->isSMTP();
$phpmailer->Host       = $host;
$phpmailer->SMTPAuth   = true;
$phpmailer->Username   = $username;
$phpmailer->Password   = $password;
$phpmailer->SMTPSecure = $SMTPSecure;
$phpmailer->Port       = $port;

// OAuth設定
// Google OAuthプロバイダのインスタンスを作成
$provider = new Google(
    [
        'clientId' => 'クライアントID',          // Google Cloud Platformで取得したクライアントID
        'clientSecret' => 'クライアントシークレット', // Google Cloud Platformで取得したクライアントシークレット
    ]
);

// PHPMailerのOAuth設定
$phpmailer->setOAuth(
    new OAuth(
        [
            'provider' => $provider,                    // 上で作成したGoogle OAuthプロバイダのインスタンス
            'refreshToken' => 'リフレッシュトークン',   // 事前に取得しておく必要があるリフレッシュトークン
            'userName' => '認証メールアドレス',         // 認証に使用したGMailアドレス
        ]
    )
);
前回のSMTPによるメール送信はこちらです。

いかがでしたが、手順がかなり長くて面倒くさいですが、
一度覚えるとGUIで進めるだけなのでそこまで手間ではありません。
ぜひ、利用してみてください。

[RelService] [Service]