お問い合わせフォームをゼロから作った話

WordPress の Contact Form 7 から、Resend API を使ったサーバーレスなお問い合わせフォームへ。プラグインなしでメール送信する仕組みを構築しました。

プラグインがない世界

WordPress では Contact Form 7 というプラグインを入れるだけで、お問い合わせフォームが完成します。フォームの設定、メールの送信、スパム対策まで全部やってくれる。

Astro に移行して、その「全部やってくれる」がなくなりました。

フォームの HTML は書ける(WEBデザイナーかつ、コーディングもそれなりに経験ありなので)。問題は、送信ボタンを押したあとの処理。入力されたデータをメールとして送る仕組みが必要です。

Resend という選択肢

Claude Code が提案してくれたのは、Resend というメール送信 API でした。

仕組みはシンプルです。

  1. ユーザーがフォームに入力して送信
  2. Cloudflare Pages 上の API ルートがリクエストを受け取る
  3. Resend API にメール送信をリクエスト
  4. 指定したメールアドレスにお問い合わせ内容が届く

サーバーを持たなくても、API 経由でメールが送れる。これが「サーバーレス」の意味でした。

スパム対策

WordPress では reCAPTCHA や Akismet でスパム対策をしていましたが、今回はもっとシンプルな方法を採用しました。

ハニーポット方式です。

フォームに「人間には見えない入力欄」を追加しておきます。普通のユーザーはこの欄に何も入力しません。でも、スパムボットは全部の欄を自動入力するので、「見えない欄に入力がある=スパム」と判定できます。

reCAPTCHA のような「私はロボットではありません」チェックを入れなくて済むので、ユーザー体験もスッキリ。

環境変数で秘密を守る

メール送信には API キーが必要ですが、コードに直接書くわけにはいきません。

環境変数として Cloudflare のダッシュボードに設定しました。

  • RESEND_API_KEY — Resend の API キー
  • CONTACT_FROM_EMAIL — 送信元アドレス
  • CONTACT_TO_EMAIL — 受信先アドレス

これらはコードには含まれず、サーバー(Cloudflare)側で管理されています。

送信後の画面遷移

フォーム送信後は /contact/thanks/ にリダイレクトする仕組みにしました。「お問い合わせありがとうございます」のページが表示されて、ユーザーは送信できたことを確認できます。

WordPress では当たり前だったこの挙動も、自分で実装する必要があります。と言っても、Claude Code に「送信後にサンクスページに飛ばしたい」と伝えるだけ。

プラグインなしで作れた

Contact Form 7 が裏でやっていたことを分解すると、「フォーム HTML」「入力値の受け取り」「メール送信」「スパム対策」「完了画面の表示」の5つ。

どれも複雑なことではなかったけれど、プラグインが全部隠してくれていたから気づかなかっただけでした。

自分で作ったことで、「フォームの裏側で何が起きているか」が理解できるようになりました。