Google APIs の access_token を超絶簡単に取得する

SMTP を使った Gmail の送信がいよいよ厳しくなってきました。
SMTP 送信の代わりに Gmail API による送信であれば、Claris FileMakerからは「URL から挿入」スクリプトステップで送信することができます。

ここでおそらく一番ハードルが高いのが、API をリクエストするときに必要な access_token を取得することです。

2024年の Google Gmail 送信 の段階的制限強化

2024年は Gmail 送信について段階的に制限がかかります。
まず2月からはみなさんご存知の、たくさんメール送信するドメインで、SPF/DKIM/DMARK の対応が必要になることです。
Google Workspace 管理者ガイド メール送信者のガイドライン

また、ポートが「465」、SMTP認証が「SSL」の場合に送信できないという情報もあります。
店舗アップ♪、頑張れ♪店長!2024年2月~ Gmailへの送信ガイドラインについて

3月になって FileMaker から SMTP によるメール送信について、smtp.gmail.com へのセキュリティーエラーがでるようになって送信できないという情報が多数あります。
Claris コミュニティー Gmailの送信ができなくなってましました。filemaker proではsmtp.gmail.com:587を識別不可

Google は今年、段階的にパスワードによる SMTP や IMAP の認証をできなくし、OAuth 認証しか受け付けなくなるようです。
Google Workspace Updates 2024 年 9 月 30 日以降: パスワードのみを使用して Google アカウントおよび Google Sync にアクセスするサードパーティ アプリのサポートを終了

まず2024年6月、無料の Gmail ユーザからパスワードによる SMTP や IMAP もできなくなります。
Gmailヘルプ Gmail を他のメール クライアントに追加する

そして2024年9月、パスワードによる SMTP 送信を完全に諦めなければならない最終時期がアナウンスされています。
もうこの日以降 OAuth 認証しか認められなくなります。
Google アカウント 安全性の低いアプリと Google アカウント

OAuth 2.0 による認証の種類

Claris FileMaker から Gmail API からメールを送信するには、URL から挿入 スクリプトステップを使います。
Gmail API をリクエストするときには、必ず access_token が必要です。

「access_token を取得する」というのは、Google APIs ではいろんな方法が用意されています。
王道は、Google Cloud Console から client_id や client_secret 作成、同意画面の作成、Webサーバーの構築するなどの、「Authorization Code」フローになります。

しかし、「Authorization Code」フローは事前準備が面倒なため、サービスアカウントを使った OAuth 認証が便利です。
Claris FileMaker バージョン20 からはサービスアカウントによる認証を使った メール送信が可能になっています。
寿商会 Claris FileMaker 2023 – OAuth 2.0 によるメール送信

上記のサービスアカウントを使った方法は SMTP を使わない方法としては良いですが、
このサービスアカウントに絶大な権限を与えることになるので、大手の企業では敬遠される場合もあります。

そこで今回ご説明するのが、Google Apps Script を使った access_token の取得です。
「Authorization Code」フローの面倒さがなく、サービスアカウントのような絶大な権限を与えるわけでもない、いいとこ取りなのでお勧めです。

Google Apps Script による access_token の取得

送信したい Google アカウントでログイン後、Apps Script を開きます。
https://script.google.com/home

「新しいプロジェクト」をクリックし、コード入力をするエディタ画面が開きます。

先に左のギヤアイコン「プロジェクトの設定」をクリックし、プロジェクトの設定画面を開きます。
「appsscript.json」マニュフェスト ファイルをエディタで表示する にチェックを入れます。

「< >」アイコンの「エディタ」をクリックして戻ります。
画面上の「appscript.json」をクリックします。

ここで取得したい Google APIs の scope を設定します。
今回はメールの送信だけをしたいので、https://www.googleapis.com/auth/gmail.send を追加したいので、
画像のように “V8” の後ろから、カンマから始まる文字を追加します。

,
"oauthScopes": [
"https://www.googleapis.com/auth/gmail.send"
]


ちなみに、本投稿の手法は Gmail 送信のみならずほとんどの Google API へアクセスできる access_token が取得できるようになります。
Google OAuth 2.0 Scopes

「コード.gs」をクリックして戻ります。
まずは、今入っている function myFunction の中に次のコードを入れます。

console.log(ScriptApp.getOAuthToken());

「実行」ボタンをクリックします。
すると、「認証が必要です」のダイアログが出ます。
「権限を確認」をクリックし、OAuth 認証画面が出るので、アカウントの選択や、権限の許可など適宜進めていきます。

すべて成功すると、実行ログの場所に見えているのが、今回取得できた access_token になります。
これで、Google Apps Script で簡単に access_token が取得できることが確認できました。

Google Apps Script で取得した access_token を外部から取得する

Google の access_token は作成後 3600秒(1時間)有効ですが、
毎回この「実行」ボタンを押してコピペというわけにはいきません。

そこで、Google Apps Script の Web サーバー機能である、doGet、doPost 関数を使用します。

弊社ではすでにこの2つの関数の使い方について解説していますので、詳しくはそちらをご覧ください。
寿商会 Google Apps Script への GET リクエストによるスプレッドシートデータの取得
寿商会 Google Apps Script を利用したWebhook (POST) によるスプレッドシートへの書き込み

また、ハッシュ値を使ってよりセキュアに実行する手法も解説しています。
寿商会 Google Apps Script をセキュアに実行

今回はざっくり最低限のセキュリティーでのコードをご紹介します。
これは POST 送信で送ってきた秘密のパスワードが一致したら access_token を返すものです。
秘密のパスワード部分は適宜変更してください。

function doPost(e){
if( "秘密のパスワード" == e.postData.contents ){
return ContentService.createTextOutput().setContent(ScriptApp.getOAuthToken());
}else{
return ContentService.createTextOutput().setContent('NG');
}
}

「デプロイ」をクリックし、「新しいデプロイ」をクリックします。


種類の選択の横のギヤアイコンをクリックし、「ウェブアプリ」をクリックします。

「アクセスできるユーザー」が「自分のみ」になっているのを「全員」に変更し、「デプロイ」ボタンをクリックします。

これで Google Apps Script は完成になります。
ウェブアプリの URL をコピーしてメモ帳などに控えてください(あとで確認することもできます)。
「完了」ボタンをクリックします。

Claris FileMaker 側からの取得

ここまでの手順で Google Apps Script で POST受信可能な Web サーバーが立ち上がっています。
FileMaker からは URL から挿入で取得します。

URL は先程メモ帳などに控えた URL を入れます。
cURL オプションの指定では次のオプションを設定します。

"-L -d 秘密のパスワード"

リクエストすると、レスポンスに access_token が返ってきていますし、
秘密のパスワードが違っていたら NG が返ってきています。

Gmail API をリクエストして送信

またここまでの方法で取得した access_token を使って Gmail API で送信しようとすると、
まだ Gmail API を有効にしていないため最初は 403 エラーになり、
そのレスポンスの中に次のようなメッセージが含まれています。

Gmail API has not been used in project 18XXXXXXX15 before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/gmail.googleapis.com/overview?project=18XXXXXXX15 then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.

そのエラーのレスポンスの中にある URL を開き、Gmail API を有効にする必要があります。

長くなったので、ここから先は次回にさせていただきます。
次回:Gmail API からメールを送信する users.messages.send
RFC2822 にそこそこ準拠した文字列を作成しないとダメなのが面倒なところです。

で、実は私とは別のスタッフが、「Google Apps Script で超絶簡単にメール送信する」の記事を作成中ですので、そっちのほうが先になるかも。

【 余談 】
最近下記リンク先への流入増大したいこともあり、
流入量が多いとブログの価値が高まりますます投稿を加速していきたいと思います。
リンク先を開いていただけると大変助かります。
Claris International Inc. (日本語)
ご協力いただけましたら幸いです。

より広範な才能を受け入れられるよう採用を強化しています。
新しいテクノロジーを自ら楽しんで仕事したい方は次のリンク先もご覧ください。
弊社採用情報
求人ボックス.com 寿商会 ページ