サポート » プラグイン » Contact Form 7でメールアドレスのチェックを厳格にしたい

  • 解決済 Terui

    (@teruiazalea)


    飲食店サイトをWordPressで構築しており、
    Contact Form 7を使って来店予約フォームなどを構えています。

    月イチペースで先方のメールアドレス宛にメールが届いていない現象を確認して調査したところ、
    @の前にピリオドがあるメールアドレスや、
    @の前の部分の中でピリオドが2つ続いている場合が
    メール送信していない現象に繋がっているようです。

    RFC規約違反のメールアドレスを、
    phpmailerでのvalidateAddressの正規表現にて拒絶されているようなので、
    Contact Form 7でのフォーム上でメールアドレスのチェックを
    同じ水準に引き上げたいのですが
    既に取り組まれた事例などありましたら教えてください。
    Contact Form 7で甘い判定をしてしまうのは間違っていると思います。

    WordPress 4.8.9
    Contact Form 7 4.9.1

9件の返信を表示中 - 1 - 9件目 (全9件中)
  • gblsm

    (@gblsm)

    過去トピックが参考になると思います。
    「phpmailerでのvalidateAddressの正規表現」について詳しくないため組込み方法など不明ですが。

    Contact Form 7 のメールアドレス入力欄でフリーメールを拒否設定したいです
    https://ja.wordpress.org/support/topic/contact-form-7-のメールアドレス入力欄でフリーメールを拒/

    モデレーター Takayuki Miyoshi

    (@takayukister)

    https://teratail.com/questions/122777

    他の場所で先行して議論されているのでしたらせめてリンクぐらいはしてください。でないと双方の回答者に余計な手間と時間の無駄が生じますので。

    モデレーター Takayuki Miyoshi

    (@takayukister)

    PHPMailer のソースコードをご覧になっているのであればわかると思いますが、validateAddress() の関数内ですら複数のバリデーションパターンが用意され、サーバー環境や設定に応じて使い分けられています。すべてを RFC 基準の単一のパターンで検証するというのは理想的ではありますが、それで現実の問題をすべて解決できるというわけではありません。

    このケースに関して言えば、

    @の前にピリオドがあるメールアドレスや、
    @の前の部分の中でピリオドが2つ続いている場合が

    このようなメールアドレスが現実に存在し使われているのですから、たんに「不正なメールアドレスです」とエラーを返して送信をはじくだけではユーザーを混乱させることになり不親切です。

    https://contactform7.com/2015/03/28/custom-validation/

    こちらを参考にカスタムバリデーションのフィルタを定義して、「@の前にピリオドがあるメールアドレスや@の前の部分の中でピリオドが2つ続いているものはここでは受け付けられない」旨のより明確なエラーを返すのが適切かと思います。

    トピック投稿者 Terui

    (@teruiazalea)

    不手際や説明不足でご迷惑をおかけしてすみません。

    
    add_filter('wpcf7_validate_email', 'wpcf7_validate_email_reject_nonrfcmail', 11, 2);
    add_filter('wpcf7_validate_email*', 'wpcf7_validate_email_reject_nonrfcmail', 11, 2);
     
    function wpcf7_validate_email_reject_nonrfcmail($result,$tag){
      $tag = new WPCF7_FormTag( $tag );
    
      $email = isset($_POST[$tag->name]) ? trim($_POST[$tag->name]) : '';
    
      if (!empty($email)){
        list( $local, $domain ) = explode( '@', $email, 2 );
        if ((substr($local, 0, 1) == '.') || (substr($local, -1, 1) == '.')) {
          $result->invalidate ($tag, '.で始まるアドレスや.で終わるアドレスは中継・受信できないことがあるため送信できません'); 
          break;
        } else {
          $pos = strpos($local, '..');
          if ($pos !== false) {
            $result->invalidate ($tag, '..を含むアドレスは中継・受信できないことがあるため送信できません'); 
            break;
          }
        }
      }  
     
     return $result;
    }
    

    カスタムバリデーションの事例を参考にこんなコードを足してみましたが、
    試しに test..test@example.com を与えたらエラーメッセージが表示されずに通ってしまい、
    先方には送られず身内にのみメール送信されているという状況です。

    トピック投稿者 Terui

    (@teruiazalea)

    確認させてほしいのですが、
    上記に示したカスタムバリデーションのコードは、
    どこに記載すれば良いのでしょうか、
    ドキュメント類を読むに連れて、
    (フォーム、メール、メッセージと並ぶ)「その他の設定」に現在記載していますが、
    機能していないようなので、
    サーバー上に別途ファイルを起こして置くものでしょうか?

    hima_art

    (@hirapapa)

    本件の本質とは外れているので参考に読んでいただければと思います(ご意見等は不要です)。

    そもそもメールでの認証機能(確実に届くメールかの確認をする機能)がないのでいくらチェックしても文字の入力間違いなどまでは分からないので、届かないメールが使われなくなることはないと思われます。

    なるべく・・という条件であればメールアドレスを2度入力してもらってチェックをする「Contact Form 7 confirm email field」プラグインを使用するのが妥当なのかもしれませんが、それでもコピーペーストされれば間違ったままになる可能性もあります。

    確実にということであればWordpressのユーザー登録を利用して登録してもらい(確認メールをクリックしてアクティベートしないようなプラグインを使用しない)、ContactForm7の設定でログインユーザーに限定すれば一度は確実に届いたメールアドレスが使用されるので根本解決できると思います。

    本当に本件の本質とは関係ない1つのアイディアですので参考程度に見ていただければ結構です。

    トピック投稿者 Terui

    (@teruiazalea)

    カスタマイズの方法など知らないところから手を付けておりましたが、

    wp/wp-content/plugins/contact-form-7/includes/functions.php
    にカスタムバリデーションのコード

    
    function wpcf7_validate_email_reject_nonrfcmail($result,$tag){
        $tag = new WPCF7_FormTag( $tag );
    
        $email = isset($_POST[$tag->name]) ? trim($_POST[$tag->name]) : '';
    
        if (!empty($email)) {
            list( $local, $domain ) = explode( '@', $email, 2 );
            if ((substr($local, 0, 1) == '.') || (substr($local, -1, 1) == '.')) {
                $result->invalidate ($tag, '.で始まるアドレスや.で終わるアドレスは中継・受信できないことがあるため送信できません'); 
                break;
            } else {
                $pos = strpos($local, '..');
                if ($pos !== false) {
                    $result->invalidate ($tag, '..を含むアドレスは中継・受信できないことがあるため送信できません'); 
                    break;
                }
            }
        }
        
        return $result;
    }
    
    add_filter('wpcf7_validate_email', 'wpcf7_validate_email_reject_nonrfcmail', 11, 2);
    add_filter('wpcf7_validate_email*', 'wpcf7_validate_email_reject_nonrfcmail', 11, 2);
    

    を追記し、
    コンタクトフォーム→その他の設定、は空欄にしたところ、
    ようやくメール送信しなくなりました。

    しかし、エラーメッセージの表示もなく、
    ぐるぐると処理中であるアニメーション画像が表示され続けているので、
    エラーメッセージ表示に確実に繋げる方法などありましたら
    アドバイスお願いします。
    (フォーム設置者にも相談中です。)

    • この返信は6年前にTeruiが編集しました。理由: より丁寧な説明に見直し
    モデレーター Takayuki Miyoshi

    (@takayukister)

    通常、こういったカスタム化コードはなるべく更新の少ない場所に置きます。テーマや子テーマの functions.php がよく使われますが、それらにも更新がよくある場合は独立したプラグインとして実装されることもあります。今回のようにプラグイン本体のコードに変更を加えると、何か問題が生じた場合に原因を特定しづらくなりますし、プラグインに更新があった場合に変更部分がまるまる失われることになります。

    ぐるぐると処理中であるアニメーション画像が表示され続けているので、

    こういった現象が見られるのはコードのどこかに不備があり処理がそこで異常停止している場合です。掲載されたコードをざっと見た限りではとくに問題を起こしそうなおかしな箇所も見当たりませんので、おそらくどこか別のところに問題があるのだろうと思います。一時的に WP_DEBUG モードに切り替えることで原因特定の手がかりが得られるかもしれません。

    トピック投稿者 Terui

    (@teruiazalea)

    コードにミスが見つかりました。

    
    function wpcf7_validate_email_reject_nonrfcmail($result,$tag){
        $tag = new WPCF7_FormTag( $tag );
    
        $email = isset($_POST[$tag->name]) ? trim($_POST[$tag->name]) : '';
    
        if (!empty($email)) {
            list( $local, $domain ) = explode( '@', $email, 2 );
            if ((substr($local, 0, 1) == '.') || (substr($local, -1, 1) == '.')) {
                $result->invalidate ($tag, '.で始まるアドレスや、.@を含むアドレスは中継・受信できないことがあるためメール送信できません。お電話にてご連絡くださいますようお願い申し上げます。'); 
            } else {
                $pos = strpos($local, '..');
                if ($pos !== false) {
                    $result->invalidate ($tag, '..を含むアドレスは中継・受信できないことがあるためメール送信できません。お電話にてご連絡くださいますようお願い申し上げます。'); 
                }
            }
        }
        
        return $result;
    }
    
    add_filter('wpcf7_validate_email', 'wpcf7_validate_email_reject_nonrfcmail', 11, 2);
    add_filter('wpcf7_validate_email*', 'wpcf7_validate_email_reject_nonrfcmail', 11, 2);
    

    として(先のソースで break; が500エラー原因だったようです)、
    無事メールアドレスのチェックを厳格に出来ました。

    不慣れなカスタマイズにおいて、助言が大変役に立ち、
    実装したいことが実現できて幸せです。
    ほんとうにありがとうございます。

9件の返信を表示中 - 1 - 9件目 (全9件中)
  • トピック「Contact Form 7でメールアドレスのチェックを厳格にしたい」には新たに返信することはできません。