EmDashにお問い合わせフォームを付ける|保存しないAstroページの作り方
EmDashのブログ雛形にはお問い合わせフォームがありません。編集部は src/pages/contact.astro を1枚足し、サーバーに保存せず通知だけするフォームを作りました。迷惑な送信を落とす5つの判定も紹介します。
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つの判定
公開したフォームには、機械が送ってくる営業や英文のスパムが必ず届きます。編集部は次の順で確かめています。
- 見えない入力欄が埋まっていたら捨てる(人には見えない欄を機械だけが埋める)
- ページを開いてから3秒たたずに送られたら、入力エラーにする
- 必須の項目・メールの形・本文の長さ(10〜4,000文字)を確かめる
- お名前とメールアドレスに改行が入っていたらエラーにする
- ひらがな・カタカナが3文字未満なら捨てる(漢字は数えない。数えると中国語のスパムが通るため)
1と5で落としたときも、画面には「送信しました」と出します。「日本語で書いてください」と教えると、日本語を混ぜて送り直してくるからです。
さらに Cloudflare は、送ってきた人の国を request.cf.country で教えてくれます。日本以外からの送信は、捨てずに通知の件名へ [海外] と付けています。
手元で試した結果
公開前に、wrangler dev で次の3通りを送って確かめました。
- メールの形が違い本文が短い → 「メールアドレスを正しく入力してください」「お問い合わせ内容は10〜4,000文字で入力してください」などの入力エラーが出た
- 英語だけの本文 → 「送信しました」と出て、通知は送られない
- 日本語の本文(手元では通知先の鍵を入れていない)→ 「送信できませんでした」と出た