メインコンテンツへスキップ

Tech

Contact Form 7 のスパムと送信ログ問題を実装で解決する

WordPress定番フォーム Contact Form 7 で起きがちな「スパム激増」「送信履歴が残らない」「通知が届かない・分岐できない」問題を、軽量な多層防御と運用設計で解決する実装知見。
reCAPTCHAに頼らない方法を解説。

Contact Form 7(CF7)はWordPressフォームの事実上の標準。
だが本番運用に入った途端、3つの壁にぶつかります。
スパム、送信ログ無し、通知制御の弱さ。
受託案件で毎回ここに時間を取られてきた知見をまとめます。

Contact Form 7 でスパムが止まらないのはなぜか

CF7は素のままだとボット送信に弱いです。
問い合わせ窓口を公開した翌日から英語の自動投稿が大量に届く、という事故が頻発します。

reCAPTCHA だけでは足りない

reCAPTCHA v3 は有効だが万能ではありません。
スコア閾値をすり抜ける巧妙なボットが残るうえ、外部スクリプト読み込みで表示が重くなり、CWV(Core Web Vitals)とフォーム到達率を悪化させます。
reCAPTCHAを入れたのにスパムが減らない、という相談は多いです。

軽量な多層防御という解

外部依存を増やさず、複数の安価なフィルタを重ねるのが堅実。

  • ハニーポット: 人間に見えない隠しフィールドを置き、入力があればボットと判定して破棄
  • 送信間隔チェック: フォーム表示から送信までが数秒未満なら機械送信とみなします
  • IP・連続送信ブロック: 同一IPの短時間連投を遮断
  • 数値キャプチャ: 簡単な計算入力で軽量に人間判定

CF7は wpcf7_spam フィルタでスパム判定を自前拡張できます。
ハニーポット入力検知時に true を返せば、送信を止めつつ通常の完了画面を見せてボットに気づかせない、という挙動も作れます。
reCAPTCHAゼロでも実用十分なレベルまで落とせます。

送信ログが残らない問題をどう解決するか

CF7は標準で送信内容を保存しません。
「先週の問い合わせ、誰から何が来た?」に答えられません。
メール通知が文字化け・不達だった場合、内容が完全に消えます。

運用上ほぼ必須なのが送信ログのDB保存。
wpcf7_before_send_mail フックで送信データを受け取り、カスタムテーブルへ保存しておけば、管理画面から履歴を一覧できます。
さらに送信失敗時にDBへ退避し手動再送できる仕組みまで作れば、重要なリードの取りこぼしがゼロになります。

受託では Flamingo プラグイン併用で逃げるケースもあるが、UIが素朴で検索性が低く、CSV出力やSlackリアルタイム通知まではカバーできません。

通知メールの「届かない・分岐できない」を解消する

CF7のメール通知は2通(管理者向け・自動返信)まで。
実運用ではこれが足りません。

  • 問い合わせ種別ごとに通知先部署を変えたいです
  • 送信を Slack やチャットにリアルタイム転送したいです
  • 送信者の言語で自動返信メールを日英切替したいです

wpcf7_mail_sent フックで送信完了をフックし、入力値に応じて通知先・件名・本文を分岐、Webhook経由でSlackへ転送、といった制御を追加します。
複数事業の問い合わせ窓口を1サイトで捌くなら、この分岐通知が運用の生命線になります。
具体的な実装手順は Contact Form 7 の送信をSlackに通知する方法 で、手動Webhook実装とコード不要の設定方法の両方を解説しています。

GDPR・個人情報対応で最低限やること

問い合わせフォームは個人情報の入口。
最低限、同意チェックボックスの設置と、保存した送信ログへのアクセス権限制御は外せません。
海外向けインバウンド案件ならGDPR対応として、保存期間と削除フローも設計段階で決めておきます。
後付けは必ず揉めます。

この実装を毎回ゼロからやるべきか

ここまでの対策はどれも技術的には実装可能。
だが受託案件のたびに functions.php へ同じコードを書き、テストし、保守するのは非効率。
プロジェクトごとにコードが微妙に分岐し、属人化します。

そこで、これらを WordPress管理画面の設定だけで完結 させるために、自社で拡張プラグインを開発しています。

  • 送信ログ管理画面: 履歴一覧・CSVエクスポート
  • 多層スパム防御: ハニーポット+数値キャプチャ+IPフィルタ+連投ブロックを標準実装(reCAPTCHA不要)
  • 通知制御・条件分岐: Slack/Webhook転送、入力値による通知振り分け、多言語自動返信
  • 送信失敗リカバリ: 失敗メールをDB退避→管理画面から再送
  • GDPR対応: 同意チェックボックス自動生成・権限制御

WordPress Plugin

この記事の対策、設定画面だけで全部。

送信ログ・多層スパム防御・通知制御・GDPR対応を、コードを書かずまとめて実装する拡張プラグイン Frontierline Forms。無料版はWordPress.org公式リポジトリで配信中(管理画面から検索1つでインストール)。制作会社向けの Pro 複数サイトプラン なら、複数案件のフォーム保守をまとめて巻き取れます。

Frontierline Forms の詳細を見る → フォーム実装を相談する

まとめ

Contact Form 7 は素のままでは本番運用に耐えません。
スパムは多層防御、送信ログはDB保存、通知は分岐とWebhook転送、個人情報対応は設計段階で。
これらを押さえれば、CF7は受託案件でも安心して使える基盤になります。

毎回ゼロから実装する手間を省きたいなら、プラグインで一括解決するのが最短。
WordPressサイトのフォーム改修・受託のご相談は お問い合わせフォーム まで。

よくある質問

Q. Contact Form 7 のスパム対策に reCAPTCHA は必須ですか? 必須ではありません。
ハニーポット・送信間隔チェック・IPブロック・数値キャプチャの多層防御で、reCAPTCHAなしでも実用十分なスパム遮断が可能です。
外部スクリプト不要で表示も軽くなります。

Q. Contact Form 7 の送信内容を保存・一覧表示するには? CF7標準では保存されません。
wpcf7_before_send_mail フックでカスタムテーブルに保存するか、ログ管理機能を持つ拡張プラグインを使います。
後者なら管理画面から履歴一覧・CSV出力まで可能です。

Q. 問い合わせ種別ごとに通知先を変えられますか? 可能です。
wpcf7_mail_sent フックで入力値を判定し、通知先メール・件名・本文を分岐できます。
Slack/Webhook転送と組み合わせれば複数窓口を1サイトで運用できます。