当サイトはCloudflare上で動く、いわゆる「サーバーレス」構成です。この話をすると、よく聞かれることがあります。「サーバーがないなら、問い合わせフォームのメールはどうやって送るの?」と。

結論から言うと、送れます。ただしSMTPは使いません。Gmailの HTTP API を使えば、サーバーレスでも確実にメールを届けられます。実際、このサイトのフォームもその方式で動いています。仕組みを順に説明します。

サーバーレスでメールが届くまでの4ステップの図解

なぜ「サーバーレスだと送れない」と言われるのか

従来のレンタルサーバーでは、SMTPという仕組みでメールを送るのが一般的でした。PHPの mail() 関数などが代表例です。

ところがCloudflare Workersのようなサーバーレス環境は、このSMTPが使えません。SMTPは「生のTCP接続」を必要としますが、Workersの実行環境(V8 isolate)はそれを許していないためです。だから「サーバーレスはメールに弱い」と誤解されがちです。

でも、抜け道はあります。HTTPで叩けるメールサービスを使えばいいのです。fetch で呼べるAPIなら、生のTCP接続は要りません。

SMTPとHTTP APIの比較図

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月時点の情報です。各サービスの仕様は変更される場合があります。