サーバーレスでも問い合わせフォームのメールは送れる — Cloudflare Workers × Gmail API
「サーバーレスなら問い合わせフォームのメールはどう送るの?」——よく聞かれる疑問です。SMTPが使えない理由と、GmailのHTTP APIで送る方法、確認画面・自動返信までを、当サイトの実装を例に説明します。

当サイトはCloudflare上で動く、いわゆる「サーバーレス」構成です。この話をすると、よく聞かれることがあります。「サーバーがないなら、問い合わせフォームのメールはどうやって送るの?」と。
結論から言うと、送れます。ただしSMTPは使いません。Gmailの HTTP API を使えば、サーバーレスでも確実にメールを届けられます。実際、このサイトのフォームもその方式で動いています。仕組みを順に説明します。

なぜ「サーバーレスだと送れない」と言われるのか
従来のレンタルサーバーでは、SMTPという仕組みでメールを送るのが一般的でした。PHPの mail() 関数などが代表例です。
ところがCloudflare Workersのようなサーバーレス環境は、このSMTPが使えません。SMTPは「生のTCP接続」を必要としますが、Workersの実行環境(V8 isolate)はそれを許していないためです。だから「サーバーレスはメールに弱い」と誤解されがちです。
でも、抜け道はあります。HTTPで叩けるメールサービスを使えばいいのです。fetch で呼べるAPIなら、生のTCP接続は要りません。

Gmailの「HTTP API」で送る
このサイトでは、追加のメール配信サービスを契約せず、手持ちのGmailアカウントから送っています。SMTPの代わりに、GmailのAPIをHTTPで呼ぶ方式です。
流れはシンプルです。
- まず、保存しておいた認証情報(リフレッシュトークン)から、その場限りのアクセストークンを取得する
- 次に、メール本文を組み立て、GmailのAPIにHTTPで送信を依頼する
コードにすると、こんなイメージです。
// 1) リフレッシュトークン → アクセストークン(HTTPで取得)
const res = await fetch("https://oauth2.googleapis.com/token", {
method: "POST",
body: new URLSearchParams({ /* client_id, refresh_token, grant_type ... */ }),
});
// 2) 組み立てたメールを Gmail API に送信(fetch だけで完結)
await fetch("https://gmail.googleapis.com/gmail/v1/users/me/messages/send", {
method: "POST",
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify({ raw: base64url(mime) }),
});ポイントは、すべて fetch(HTTP)だけで完結することです。生のTCP接続はどこにも要りません。だからWorkers上でそのまま動きます。Cloudflareへの載せ方そのものは、別記事で詳しく書いています。
確認画面と自動返信まで作り込む
メールが送れるだけでは、実用的なフォームとは言えません。このサイトでは次の3つを足しています。
- 確認画面:入力 → 確認 → 送信の3ステップ。送信前に内容を見直せる
- 自動返信:問い合わせた人に受付メールを自動で返す。同時に自分にも通知が届く(通知メールの返信先は問い合わせ者のアドレス)
- 日本語対応:件名や差出人名が文字化けしないよう、MIMEエンコードを通す
ここまでやると、レンタルサーバー時代のフォームと遜色なく使えます。
迷惑メール対策は「別の層」で
メールが送れるようになると、次に来るのが迷惑メール(bot送信)です。これはメール送信とは別の問題なので、別の対策で守ります。
このサイトでは、ハニーポット・送信タイミングの検証・Cloudflare Turnstileの3層で防いでいます。詳しくは問い合わせフォームのスパム対策にまとめました。
まとめ
「サーバーレスにすると、問い合わせフォームが作れないのでは」と不安に感じる必要はありません。表示も速く、サーバー管理の手間もないまま、フォームはきちんと動かせます。サイトの新規制作やリニューアルで構成にお悩みでしたら、お問い合わせからお気軽にご相談ください。
本記事は2026年6月時点の情報です。各サービスの仕様は変更される場合があります。