Gmail API からメールを送信する users.messages.send

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

前回は先に Google APIs の 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 アカウント

Claris FileMaker から Gmail API を使ってメールを送信するのに必要なもの

Claris FileMaker から Gmail API を使ってメールを送信するのに必要なものは次の通りです。
この順に沿って解説し、最後には送信ができる状態までご説明します。

  • Gmail が使える Google アカウント
  • access_token , (Google Cloud プロジェクト , client_id , client_secret , Gmail API 有効化)
  • 送信データを作成する計算式
  • 「URL から挿入」スクリプトステップ

Gmail が使える Google アカウント

無料の Gmail アカウントでもかまいません。
あまり知られていないですが、Gmail を使わないのであれば自社ドメインのメールアドレスをそのまま Google アカウントにすることもできますが、そのアカウントでは Gmail API は使用できません。

また、Google Workspace のプランによってや、管理者コンソールで Gmail の利用を許可されていなければ、Gmail API を使うことはできません。

access_token , (Google Cloud プロジェクト , client_id , client_secret , Gmail API 有効化)

Google APIs では、リクエストする際に、access_tokenが必要なものと、access_token の代わりに API_Key が必要なものと分かれています。大まかには、Drive や Gmail など個人が持っているデータ領域の API は access_token が必要、Maps や 翻訳 などリクエストのデータに対するレスポンスのような API は API_Key が必要という切り分けです。

Google APIs の access_token を超絶簡単に取得する でも書いている方法などを使って、access_token を取得してください。

上記の方法に沿っていくと問題ないのですが、上記の方法ではなく一般的な方法では、Google Cloud プロジェクト , client_id , client_secret , 同意画面 , Gmail API の有効化 という順に作成していき、その後ようやく access_token が取得できるようになります。

送信データを作成する計算式

Gmail API リファレンス では、特に送信に関してあまり詳しい説明が書かれていません。
Google Method: users.messages.send

RFC2822 に対応したデータを作れ、それを URLsafe な Base64Encode して送れ、と書いてあるが、それをどのようにJSONパラメータに入れていけばいいかわかりにくくなっています。

送信する JSON は {“raw”:”ここにRFC2822形式のデータをURLsafe な Base64Encodeした文字列”} になります。
JSON オブジェクトの key に to とか subject を入れるわけではありません。

また、RFC2822形式が必要といっても、間違った設定値を入れると文字化けしたり送信できなかったりします。
RFC2822 では必須と言われている設定値が入っていなくても、 Gmail API では Google 側が補完してきちんと送信してくれます。
そのため、RFC2822形式とは言われていますが、最低限必要なパラメータだけに絞って送信するのがいいと思います。

必須
・宛先(TO か CC か BCC を1件以上)
・文字のエンコード情報(Content-Transfer-Encoding)

任意
・件名(Subject)
・本文
・形式(Content-Type)
・その他必須とRFC2822では言われているもの(From,Return-Path,MIME-Version,Date,Message-ID)

そのため、プレーンテキストを Gmail API で送信する最小限のデータは次のようになります。
文字化けを防ぎたいので Content-Transfer-Encoding は base64データを使用する例にしています。

To: 送信先メールアドレス
Subject: =?UTF-8?B?[ここにBase64エンコードした件名]?=
Content-Transfer-Encoding: base64

[ここにBase64エンコードした本文]

そしてこれを Gmail API へ送信できる JSON にまで作り上げる FileMaker の計算式は次のようになります。
こちらからサンプルファイルもダウンロード していただけます。

「URL から挿入」スクリプトステップ

送信は簡単で、access_token をヘッダに入れて、上記で作成した JSON を POST 送信するだけです。
これを FileMaker の URL から挿入 スクリプトステップで設定する cURL オプションの計算式は次のようになります。
こちらからサンプルファイルもダウンロード していただけます。

注意点

Gmail の送信は quota という単位で管理され、毎秒 250 quota/ユーザ が使用できます。
メールの送信は 100 quota を使用するので 2.5通/秒 送信できます。
Usage limits

一つの FileMaker スクリプトが Loop を回す時や、サーバー上のスクリプトを実行など、案外1秒の中で3回ぐらいメール送信スクリプトがかぶってしまい送信エラーになる場合がありますので注意が必要です。

また、たくさんの宛先に一気にメール送信をするとメールドメインのランクが落ちて、普通のメール送信にも影響がでる可能性があるので、プログラムによる送信では十分注意して送信してください。

終わりに

実は私とは別のスタッフが、「Google Apps Script で超絶簡単にメール送信する」の記事を作成中ですので、そっちのほうが結局楽かもしれません。ご期待ください。

更新

2024.3.27 Base64エンコードテキストを URLsafe にするようにブログ内やサンプルファイルを更新しました。
@qbxxdp 様 ご指摘いただきありがとうございました。

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

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