公開日:
更新日:
10 min read
技術革新Cloudflare workersでGmailを使ってメール送信を実装する 準備編

- 準備編←今ココ
- 開発環境編(準備中)
- 実装編(準備中)
ホームページのフォームから送られてきた内容をメールで送信する機能を実装したい。ホームページは静的コンテンツ(html)なので、CloudFlare Pagesにデプロイしています。ジェネレーターはAstroです。GitHubリポジトリに原稿をpushすれば、自動でビルドしてくれるので、これはすごい!しかも無料!
私は超ベテラン年寄りエンジニアで、10年ほど現場からは離れていたこともあり(システム案件には何らかの形でかかわっていた)、3年前に現場に復帰したころは浦島太郎異世界転生ものでした。
20世紀のバージョン管理は、なんといってもVisual SourceSafeでした。それが21世紀になるとGitHubとやらで、これがまったくわけわからん。
概念が根本的に異なるので、それを理解するのも一苦労だったのに「チェックアウト」の意味すらVisual SourceSafeとかけ離れているので、下手に知識があるから混乱するばかりの今日のこの頃、皆様方におかれましては誠にご健勝のこととお喜び申し上げます。
【悲報】cloudflare workersで使える無料のメール送信サービスは終了していた
問合せフォームのメール送信に適したサービスをAIに聞いてみたところ、以下のような回答が返ってきた。
Cloudflare Workersで使用できる無料のメール送信サービスとして、MailChannels Send APIがおすすめです。このサービスは以下の特徴を持っています:
-
完全無料: 使用量や送信数に関係なく、無料で利用できます。
-
使用期限なし: 特に期限は設定されていません。
-
簡単な設定: Cloudflare WorkersからAPIを直接呼び出すだけで利用可能です。
-
1日10通程度の送信に最適: 小規模な送信量に適しています。
-
スパム対策機能: 自動的に有害なコンテンツを識別してブロックします。
-
ドメイン認証: Domain Lockdown DNSレコードを設定することで、独自ドメインからのメール送信が可能です。
使用方法:
-
送信元ドメインのDNSにDomain Lockdownレコードを設定します。
-
Cloudflare Workerのコードで、MailChannels Send APIのエンドポイント(https://api.mailchannels.net/tx/v1/send)にPOSTリクエストを送信します。
-
リクエストボディにメールの送信元、宛先、件名、本文などの情報をJSON形式で含めます。
をを!これはすごい!と思い、2日かけて実装するが、全くメールが送信できない。APIを呼び出すと認証エラーが返ってくる。
プログラムを隅々までチェックした。これ以上のことはできない。AIの答えは正しいとは限らない、とチャットにはしつこいほど書いてある。こういうときは古典的な手段、つまりGoogleで検索するしかない。
MailChannelsとCloudFlareの連携は2024年6月30日でサービス終了しますた(泣)
俺の時間を返せ…😿
【難問】Gmailで送信しよう
CloudFlare Workersの呪い制約
1. Google APIパッケージの使用不可:
Cloudflare WorkersはNode.js環境ではないため、Node.js用のGoogle APIクライアントライブラリを直接使用することはできません。代わりに、Google APIのRESTエンドポイントに直接HTTPリクエストを送信する必要があります。
2. Nodemailerパッケージの使用不可:
同様に、NodemailerもNode.js環境に依存しているため、Cloudflare Workersでは使用できません。
実装前の超絶面倒くさい準備
ハッキリ言って、これにたどり着くまでかなりの時間を要した。AIを駆使してもうまくいかない。数日前に発表されたChat-GPT4o1モデルで、ようやく答えにたどり着けた感がある。
-
サービスアカウントの作成:
-
Google Cloud Consoleにアクセスし、新しいプロジェクトを作成するか、既存のプロジェクトを選択します。
-
左側のメニューから「IAMと管理」→「サービスアカウント」を選択します。
-
「サービスアカウントを作成」をクリックし、サービスアカウント名と説明を入力します。
-
他はすべて省略して完了をクリックします。
-
サービスアカウントを作成したら、「OAuth2 クライアントID」 をメモします。
-
-
必要なロールの付与:
- 左側のメニューから「IAMと管理」→「IAM」を選択します。
- 該当するプリンシパルをチェックして「アクセス権を付与」をクリックします。
- プリンシパルの追加の、 「新しいプリンシパル」 に、「サービスアカウント」 の長い文字列を入力します。
- 「ロールを割り当てる」で、**「サービス アカウント管理者」**のロールを選択します。
- 「別のロールを追加」をクリックし、**「サービス アカウント キー管理者」**のロールを選択します。
- 「別のロールを追加」をクリックし、**「サービス アカウント トークン作成者」**のロールを選択します。
- 「別のロールを追加」をクリックし、**「IAP ポリシー管理者」**のロールを選択します。
- 保存をクリックします。
-
Gmail APIの有効化:
-
左側のメニューから「APIとサービス」→「ライブラリ」を選択します。
-
「APIとサービスを検索」に”gmail”と入力して”gmail api”を選択する
-
検索結果の**「Gmail API」**を選択する。
-
「有効にする」をクリックします。
-
-
「組織のポリシー管理者」のロール付与
-
左側のメニューから「IAMと管理>IAM」を選択します。
-
組織の管理者の右側にある編集アイコンをクリックします。
-
「別のロールを追加」をクリックして「組織ポリシー管理者」を選択します。
- 「保存」をクリックします。
-
-
「サービス アカウント キーの作成を無効化 のポリシー」の無効化
-
左側のメニューから「IAMと管理>組織のポリシー」を選択します。
-
フィルタに「iam.disableServiceAccountKeyCreation」を入力します。
-
表示されたiam.disableServiceAccountKeyCreationのリンクをクリックします。
-
「ポリシーを管理」をクリックします。
-
「親のポリシーをオーバライドする」を選択します。
-
「ルールの追加」をクリックします。
-
適用を「オン」にします。
-
完了をクリックします。
-
-
サービスアカウントの鍵を生成:
-
左側のメニューから「IAMと管理>サービスアカウント」を選択します。
-
作成したサービスアカウントをクリックして詳細ページを表示します。
-
「キー」タブを選択します。
-
「鍵を追加」→「新しい鍵を作成」をクリックします。
-
**「JSON」**形式を選択し「作成」をクリックします。
-
JSONファイルを安全な場所にダウンロードします。
-
-
Google Workspace管理コンソールでのドメイン全体の委任の設定:
-
Google Workspace管理コンソール(https://admin.google.com)に管理者アカウントでログインします。
-
左側のメニューから「セキュリティ」→「▶アクセスとデータ管理」→「APIの制御」を選択します。
-
「ドメイン全体の委任を管理」をクリックします。
-
「新しいクライアントIDを追加」をクリックし、以下の情報を入力します。
- クライアントID: 手順1でメモしたサービスアカウントのクライアントID。
- OAuthスコープ: 必要なAPIアクセス権限を持つスコープを入力(
https://www.googleapis.com/auth/gmail.send
)。
-
「承認」をクリックして設定を保存します。
-
ドメイン全体の委任については、当社のような零細企業であれば問題ないでしょうが、それなりの規模の会社では注意が必要です。
-
まとめ
これで実装の準備ができた。長くなったので、今回はこのあたりで。 次回はCloudflare WorkersでGmail APIを使用してメール送信を実装する。
追伸
Gmailでエイリアスからメールを送信する場合は、「他のメールアドレスを追加」を忘れないように!
Gmail>設定>アカウント>他のメールアドレスを追加