お問い合わせフォームは、壊れていても気づきにくい部品です。
送った人には「送信しました」と出て、サイトの運営者には何も届かない、という壊れ方をします。
この記事では、Snow Monkey Formsのフォームを、本番と同じ経路で毎週自動的にテストする仕組みを作ります。
reCAPTCHAは外しません。
合言葉を付けた送信だけ、サーバー側で判定を通す形にします。
この記事で分かること
- reCAPTCHAを回避せずに、自動テストを通す考え方
- Snow Monkey Formsのどのフックを使うか
- 送信から、メールが届くまでを確かめるスクリプト
- 週1回の定期実行と、異常のときの知らせ方
- この仕組みを動かした初日に見つかった障害
結論:合言葉つきの送信だけ、スパム判定を通す
Snow Monkey Formsは、送信のたびに snow_monkey_forms/spam/validate というフィルターでスパムかどうかを判定します。
reCAPTCHAの判定も、このフィルターの中で動きます。
ここに自分のフィルターを後から足し、HTTPヘッダーの合言葉が合ったときだけ「通す」と返します。
合言葉は64桁のランダムな文字列で、外からは分かりません。
合言葉がない送信は、今までどおりreCAPTCHAで判定されます。
つまり、防御は何も変わりません。
| やること | やらないこと |
|---|---|
| 合言葉つきの送信だけ判定を通す | reCAPTCHAのキーを外す |
| 10分に1回しか受け付けない | 判定を全部スキップする |
| テストのメールに印を付ける | 本物の問い合わせと混ぜる |
reCAPTCHAを機械で「突破」する方法は、Googleの利用規約に反します。
自分のサイトでも、やらないほうがよいです。
仕組みの全体
| 部品 | 役割 |
|---|---|
| サーバー側(Code SnippetsのPHP) | 合言葉の確認、メールへの印、結果の記録 |
| 手元側(Pythonのスクリプト) | フォームのページを読み、本番と同じ形で送信し、届いたかを確かめる |
| 定期実行 | Windowsのタスクスケジューラ(Macならlaunchd、サーバーならcron) |
| 知らせ | 異常のときだけSlackに投稿(任意) |
送信は、ブラウザのJavaScriptが使っているのと同じREST APIに送ります。
CSRFのトークン、リファラーの検査、項目の必須チェック、メール送信まで、本物と同じ道を通ります。
だから「フォームの画面は出るのにメールが出ない」という壊れ方も見つけられます。
必要なもの
- Snow Monkey Forms(記事の確認は13.0.0)とCode Snippets
- Python 3(requestsを入れる)
- 届いたメールを確かめる手段(この記事ではSSHでサーバーのメール箱を見る方法と、IMAPで見る方法を載せる)
- reCAPTCHAを設定済みのフォーム(設定していなければ、この仕組みは要らない)
この仕組みで分かったこと
筆者のサイトで初めて動かした日、テストは「管理者メールの送信に失敗」で止まりました。
原因は、サーバー移転の前に作ったSMTPの設定が、移転前のサーバー名のままだったことです。
フォームの画面は正常に出ていて、問い合わせた人には何も異常が見えません。
運営者にメールが来ないだけなので、自分では気づけませんでした。
設定を直した直後のテストで、2通(管理者宛と自動返信)が24秒で届くことを確かめられました。
ここから先は、スニペットの全文、送信と確認のスクリプト、定期実行の設定、運用で踏んだ注意点です。
この記事だけ読みたい方は単品購入、ほかの有料記事も読みたい方は購読プランをご確認ください。
購読対象の記事・料金は、下のプラン案内で確認できます。
役に立った記事を、ブログやSNSで紹介しませんか?
紹介制度の対象記事・購読プランを購入した方は、codocで専用リンクと報酬条件を確認できます。
専用リンク経由で購入されると、設定された紹介報酬が発生します。
購読プランの紹介報酬は初回課金のみが対象です。
紹介時は、広告・PRであることが読者に分かるように明記してください。



