Codeworks Notes

 2021-08-17

 2025-01-24

Wordpress
functions.php

Contact Form 7 で外国語のメールを遮断する

最近ワイルドカードを使って社用アドレスのスパムメールを根こそぎ殲滅していたら、お問い合わせフォーム経由の外国語メールが増えてきた感があり、そろそろ対策しないとなあと思ったのでメモ。

Contact Form 7 の対策

対策 1. ひらがなを含むかチェック(ゆるめ)

考え方としては「本文にひらがなを含まないものを通さない」です。
Wordpress のプラグイン「 Contact Form 7 」が有効であれば、functions.php に以下のコードを追加します。

function wpcf7_validate_mb_char( $result, $tag ) {
  $field_name = 'your-message';   // チェックしたいフォームフィールド名
  $value      = str_replace(array("\r", "\n", ' ', ' '), '', $_POST[$field_name]); //改行とスペースを取り除く

  if (!empty($value)) {
    if (!preg_match('/[ぁ-ん]/u', $value)) {
      $result['valid'] = false;
      $result['reason'] = array($field_name => '【エラー】メッセージを送信できません。');
    }
  }
  return $result;
}
add_filter( 'wpcf7_validate', 'wpcf7_validate_mb_char', 10, 2 );

対策 2. 日本語が占める割合をチェック(きびしめ)

こちらは「本文にひらがなを含み、かつ本文に占める日本語の文字が指定割合以上なければ通さない」ルール。
$min_rate は 0 〜 100 の範囲で割合指定ができます。効果が薄い時はレートを上げてください。

function wpcf7_validate_mb_char( $result, $tag ) {
  $field_name = 'your-message';   // チェックしたいフォームフィールド名
  $value    = str_replace(array("\r", "\n", ' ', ' '), '', $_POST[$field_name]); // 改行とスペースを取り除く
  $min_rate = 30; //(%)最小日本語文字数の割合(これ以上でなければエラー)
  $str_l    = mb_strlen($value , "UTF-8"); // 文字数取得(ダブルクオーテーション必須)
  $str_ja   = preg_match_all("/[ぁ-んァ-ヶー一-龠0-9、。]/u", $value, $matches); // 日本語の文字数を取得
  // 日本語文字数の割合を計算
  if (!empty($value)) {
    $str_mb_rate = ($str_ja / $str_l) * 100;
  } else {
    $str_mb_rate = 0;   // フォームが空のときはゼロ除算のため計算しない
  }

  if (!empty($value)) {
    // ひらがなを含まなければfalseを返す
    if (!preg_match('/[ぁ-ん]/u', $value)) {
      $result['valid'] = false;
      $result['reason'] = array($field_name => '【エラー】メッセージを送信できません。');
    }
    // 指定割合以上の日本語を含んでいなければfalseを返す
    if ($str_mb_rate < $min_rate) {
      $result['valid'] = false;
      $result['reason'] = array($field_name => '【エラー】メッセージを送信できません。');
    }
  }
  // いずれの条件もクリアできていたら本文を戻り値に返す
  return $result;
}
add_filter( 'wpcf7_validate', 'wpcf7_validate_mb_char', 10, 2 );

これで日本語以外のメールがフォームを通らなくなります。