Elementorのフォームに迷惑メールが届く・・・、Akismetだけで安心?原因と対策を実例で解説
(※このページは2026年9月4日に執筆されました。)
WordPressのフォームに、毎日のように同じメールアドレスから意味のない問い合わせが届く……。そんな経験はありませんか?
今回は、僕が運営しているサイトで実際に起きたスパムフォーム問題と、その解決までの流れをそのまま記事にしてみました。同じ悩みを抱えている方の参考になれば嬉しいです。
きっかけは、Gmailに届く不自然な通知メール
ある日、自分のGmailの受信箱を見ていたら、「New message from “ヤギハシ ワードプレス…”」という通知メールが、同じアドレスから何日も間を空けて何度も届いていることに気づきました。
- 8月25日
- 8月30日
- 8月31日
- 9月2日
日を置いて、同じフォームに機械的に送られてくる。これは典型的な「スパムボット」の挙動です。人間が問い合わせをする場合、こんな規則性のある送り方はまずしません。
「うちはAkismet入れてるから大丈夫」が実は落とし穴だった
WordPressのスパム対策といえば、多くの方がまず思い浮かべるのが Akismet だと思います。僕のサイトにも入っていましたし、ちゃんと有効化もされていました。
ところが、実際にフォームの中身を調べてみると、思わぬ落とし穴がありました。
このフォームは Contact Form 7ではなく、Elementor Proのフォームウィジェット で作られていたのです。そして、
AkismetはWordPressのコメント欄や、Akismetと明示的に連携しているプラグイン(Contact Form 7など)しか保護してくれない
という仕様があります。Elementor Proのフォームは、標準ではAkismetと直接つながる仕組みを持っていません。つまり、Akismetが有効になっていても、Elementorのフォームに関しては何のチェックも通らずスルーされていた、ということです。
念のためフォームのHTMLも確認しましたが、reCAPTCHAやハニーポット(ボット検知用の隠しフィールド)といった、他のアンチスパム機構も一切入っていませんでした。丸腰の状態だったわけです。
対策その1:Elementor Pro標準のreCAPTCHA・ハニーポット
一番手軽で効果が高いのは、Elementor Proのフォームウィジェットに標準搭載されている
- reCAPTCHA v3
- ハニーポット(人間には見えない項目にボットが入力してしまうことを利用する仕組み)
を有効にする方法です。ほとんどの機械的なスパムはこれだけでブロックできます。まずはここから試すのがおすすめです。
対策その2:特定のメールアドレスをピンポイントで拒否する
今回は、すでに特定のメールアドレスが繰り返し送ってきていることが分かっていたので、「そのアドレスからの送信だけを狙い撃ちでブロックする」方法も併用することにしました。
Elementor Pro単体には、残念ながら「特定のメールアドレスを拒否する」という条件機能が標準では用意されていません。そこで使うのが、Elementor Proが用意している elementor_pro/forms/validation というフックです。ここにカスタムコードを書くことで、送信されたメールアドレスをチェックし、ブロックリストに一致したら送信を止めることができます。
コードを直接functions.phpに書くのは危険
「じゃあ、テーマのfunctions.phpにコードを追記すればいいのでは」と思う方もいるかもしれません。ただ、これはあまりおすすめしません。
一文字でも書き間違えると、サイト全体が真っ白(致命的エラー)になってしまうリスクがあるからです。とくに決済ページなど、止まったら困るページが同居している本番サイトでは尚更です。
そこで今回使ったのが、無料のプラグイン WPCode です。WPCodeには、追加したコードに構文エラーがあった場合、自動でそのスニペットを無効化してくれる安全機構があります。実際、僕も今回この機能に救われました(後述します)。
実際に使ったコード
add_action( 'elementor_pro/forms/validation', function( $record, $ajax_handler ) {
$blocked_emails = array(
'spam-address@example.com', // ここにブロックしたいアドレスを追加
);
$raw_fields = $record->get( 'fields' );
foreach ( $raw_fields as $field ) {
if ( empty( $field['value'] ) || ! is_string( $field['value'] ) ) {
continue;
}
if ( ! filter_var( $field['value'], FILTER_VALIDATE_EMAIL ) ) {
continue;
}
$email = strtolower( trim( $field['value'] ) );
if ( in_array( $email, $blocked_emails, true ) ) {
$ajax_handler->add_error_message( 'Submission error. Please try again later.' );
$ajax_handler->is_success = false;
}
}
}, 10, 2 );
$blocked_emails の配列に、拒否したいメールアドレスを追加していくだけのシンプルな仕組みです。フォーム内のメール欄すべてをチェックして、リストと一致すれば送信をブロックし、相手には理由を明かさない汎用エラーメッセージだけを返します。
実装中に起きた、ちょっとしたトラブル
正直に書くと、設置作業はスムーズには進みませんでした。
- 日本語のエラーメッセージがなぜか空文字になってしまった:入力の過程で文字がうまく反映されず、後から気づいて英語のメッセージに差し替えました。
- 括弧の閉じ忘れで構文エラーが発生:コードエディタの自動補完が原因で、余分な「}」が混ざってしまいました。ここでWPCodeの安全機構が発動し、「有効化中にエラーが発生しました」と自動的に止めてくれたおかげで、サイトが壊れることなく済みました。
まさに「無料プラグインでも、こういう安全装置があると全然安心感が違うな」と実感した瞬間でした。
まとめ:スパムフォーム対策の考え方
今回の件から得られた教訓を整理すると、こんな感じです。
- 「Akismetを入れているから安心」とは限らない:使っているフォームの種類(Contact Form 7なのか、Elementor Proなのか、他のプラグインなのか)によって、実際に機能しているかどうかは別問題
- まずはreCAPTCHA・ハニーポットなどの標準機能から:多くのケースはこれだけで十分効果がある
- 特定アドレスをピンポイントで止めたいなら、カスタムコード+安全機構つきのプラグイン(WPCodeなど)を組み合わせる:本番のfunctions.phpに直接手を入れるのは極力避ける
- エラーが起きても安全に止まる仕組みを用意しておく:致命的なミスをしても被害が広がらない環境を作っておくことが、結果的に一番の安心材料になる
もし同じように「フォームにスパムが来て困っている」という方がいれば、まずは自分のサイトのフォームが何のプラグインで作られているかを確認するところから始めてみてください。
