記事一覧

EmDashにお問い合わせフォームを付ける|保存しないAstroページの作り方

EmDashのブログ雛形にはお問い合わせフォームがありません。編集部は src/pages/contact.astro を1枚足し、サーバーに保存せず通知だけするフォームを作りました。迷惑な送信を落とす5つの判定も紹介します。

EmDashにお問い合わせフォームを付ける|保存しないAstroページの作り方

EmDash のブログ雛形には、お問い合わせフォームが入っていません。プラグインを探す前に、Astro のページを1枚足すだけで作れます。このサイトの「お問い合わせ」は、編集部がその方法で作ったものです。

ページを1枚足す

EmDash の雛形は Astro でできていて、src/pages/ に置いたファイルがそのままページになります。編集部は src/pages/contact.astro を作りました。先頭に次の1行を書くと、送信のたびにサーバー側で処理できるページになります。

export const prerender = false;

同じページの中で、送信されたとき(POST)だけ入力を読みます。

if (Astro.request.method === "POST") {
	const form = await Astro.request.formData();
	// ここで入力を確かめて、通知を送る
}

保存しないで通知だけする

入力された内容は、データベースにも D1 にも保存していません。確かめたあと、編集部のチャットへ通知を送るだけです。保存しないので、個人情報を預かり続けることがありません。

通知先の鍵(チャットの API トークン)は、プログラムに書かずに Cloudflare の「シークレット」に入れます。

npx wrangler secret put CHATWORK_TOKEN

ページの中では import { env } from "cloudflare:workers"; で読み出します。

迷惑な送信を落とす5つの判定

公開したフォームには、機械が送ってくる営業や英文のスパムが必ず届きます。編集部は次の順で確かめています。

  1. 見えない入力欄が埋まっていたら捨てる(人には見えない欄を機械だけが埋める)
  2. ページを開いてから3秒たたずに送られたら、入力エラーにする
  3. 必須の項目・メールの形・本文の長さ(10〜4,000文字)を確かめる
  4. お名前とメールアドレスに改行が入っていたらエラーにする
  5. ひらがな・カタカナが3文字未満なら捨てる(漢字は数えない。数えると中国語のスパムが通るため)

1と5で落としたときも、画面には「送信しました」と出します。「日本語で書いてください」と教えると、日本語を混ぜて送り直してくるからです。

さらに Cloudflare は、送ってきた人の国を request.cf.country で教えてくれます。日本以外からの送信は、捨てずに通知の件名へ [海外] と付けています。

手元で試した結果

公開前に、wrangler dev で次の3通りを送って確かめました。

  • メールの形が違い本文が短い → 「メールアドレスを正しく入力してください」「お問い合わせ内容は10〜4,000文字で入力してください」などの入力エラーが出た
  • 英語だけの本文 → 「送信しました」と出て、通知は送られない
  • 日本語の本文(手元では通知先の鍵を入れていない)→ 「送信できませんでした」と出た

関連記事