質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.83%

  • PHP

    18251questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • WordPress

    6226questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

  • 正規表現

    707questions

    正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

WordPressからRFC準拠してないメールアドレスでも送信できるようにしたい

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 411

m6u

score 5500

WordPressで飲食店の公式サイトを立ち上げてあり、
その中で来店予約フォームをContact Form 7にて実現していて、
特定のパターンのdocomo.ne.jpなメールアドレスに対して送信していないことを
確認しました。

例えば
foo.bar..baz@docomo.ne.jp
foo.bar.baz.@docomo.ne.jp
といったパターンです。

おそらくこれは、ドコモがRFCに準拠していないパターンのメールアドレスを
許可しているために起きている不幸なんじゃないかと思い、
じゃぁどこで拒否しているのかと解読してみたところ、
WordPressに含まれる
wp-includes/class-phpmailer.php 内の
public static function validateAddress($address, $patternselect = null)
にて9行にも及ぶ正規表現パターンを駆使したpreg_match()にて
falseが返ってくるところまで突き止めました。

該当箇所 in WordPress 4.8.6

        switch ($patternselect) {
            case 'pcre8':
                /**
                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                return (boolean)preg_match(
                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    $address
                );
            case 'pcre':
                //An older regex that doesn't need a recent PCRE
                return (boolean)preg_match(
                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    $address
                );

ここまで仕上がっていると、安易に正規表現に手を付けることが出来ず、
上記のようなメールアドレスを許可するように変更を加えるには
どのような変更を加えればよいでしょうか。


ご意見・ご指摘を頂いた件について補足させていただきます。

RFC規約違反のメールアドレスを送受信に使ってはいけない、
至極当然なご意見です。
本来遵守するべきことです。

この現象を発見したときに上司に報告したところ、
(RFC云々を知らない上司から)送信できるようにしろとの指示を受けたこともあり、
送信できるようにWordPressのソースコードをいじってでも対策しなければならないものと考えていました。

ですが、
RFC規約違反であり、送受信・中継サーバーに迷惑をかける恐れがあるとのご指摘で、
不達になりうる可能性も高いということで、
判定を甘くして送信しようとするのはやめようと思います。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

回答 5

+3

とりあえずメールアドレスのチェックの最小限は

https://github.com/WordPress/WordPress/blob/master/wp-includes/class-phpmailer.php#L1147

設定だけで行けるはずですが、(ソースをよんでなんで気付かないのか不思議)

まあ

Microsoft系、Google系など グローバルなサービスは一律送受信拒否してるようですがあなたの使う予定のSMTPサーバーは許可してるのでしょうか?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/21 09:15

    ここが該当箇所かぁ。。。
    この設定がどこでされてるか知りたいって質問だったのかも知れないですね。

    キャンセル

  • 2018/04/21 11:08

    > ここまで仕上がっていると、安易に正規表現に手を付けることが出来ず、

    なのでソース自体を改変しようとしている

    キャンセル

  • 2018/04/23 11:11

    あの正規表現の箇所にたどり着くまでに、結構頭が茹で上がってました。
    言われてみればなるほど、validateAddressを呼ぶところで第2パラメータに'noregex'を与えれば済むなんて、気づきませんでした。

    キャンセル

+1

いくらそこに手を加えて通したとしても、その先のメールサーバに拒否られるとか誤動作起こすとかなんとかなるんじゃないかと。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/20 18:13

    RFC非準拠なメールアドレスを使っている人がメール不達で日常的に不自由を強いられているなら、その理屈も市民権を得ると思うのですが、不自由なく使い続けているメールアドレスなんじゃないでしょうか。
    少なくともdocomo.ne.jp内では差し支えなく届くでしょうし。
    案外、拒否したり誤動作する中継サーバーってほぼほぼ無いんじゃないですかね。(独断と偏見。)
    であれば、うちはそういうメールアドレスでも送信しなきゃいけないんじゃないかと。
    いささか乱暴ですが。

    キャンセル

  • 2018/04/20 20:37

    gmailは送信拒否しますよ(笑)

    キャンセル

  • 2018/04/20 20:40

    ちなみに、docomoも2009年以降新規設定はできなくなってます。

    キャンセル

  • 2018/04/20 21:04

    OUTLOOK.COMやExchangeも送受信を拒否してるようだ

    キャンセル

  • 2018/04/21 09:59

    ってことは、docomo アドレスとしては、もう残っていないかもしれないですね。
    残ってたとしても、「まぁいつものことか」ぐらいで、ユーザビリティを損なうことはなさそう。

    キャンセル

  • 2018/04/21 11:15

    te2ji 同僚がつかってるww

    キャンセル

  • 2018/04/21 11:47

    同僚www
    その場合は、むしろ、弾いてやらないと、ユーザーエクスペリエンスとして正しくない気がします。

    キャンセル

  • 2018/04/21 11:52

    そして SendGrid さんなにやってんのあんた
    https://sendgrid.kke.co.jp/blog/?p=105
    RFC規約違反のメールアドレスについても一部送信可能になりました!

    キャンセル

+1

この入力値確認が必要な理由は
・メールアドレスのルールに従っていないアドレスを弾くため
であり、現実的な問題としては
・宛先不明メールを大量に登録されて、ドメインがスパム判定を受けてしまう
といったところかと思います。

これはルールに従ったアドレスであっても発生しうる事項なので、相当簡易な表現に変更しても、セキュリティ精度としては変わらないです。

連続投稿や、CSRF の対策がなされているのであれば、極論「@が含まれる」ぐらいにしてしまっても良いかも。

最初に述べたセキュリティ要件以外があるか整理して、ざっくり削ってみてはいかがですか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/20 20:58

    gスイートを利用したSMTPサーバー経由で送信できるようにの依頼だったら笑えるな

    キャンセル

  • 2018/04/23 11:45

    WordPressのプラグインであるContact Form 7上では甘い判定をしていて通ってしまって、
    いざ送信する場面でphpmailerが厳格に判定して落としていて、
    そのことが来店予約フォーム利用者に伝わっていないことが問題だと思うのです。

    キャンセル

check解決した方法

0

仕組みをいじってRFC規約違反のメールアドレス宛に送信できるように改変するのは乱暴すぎると反省し、
Contact Form 7側でメールアドレスの判定水準を引き上げられないか、
WordPressサポートフォーラムに場所を移して検討を進めたいと思います。

実装するまでの間は、フォーム上に注記を追加して、
こういうケースのメールアドレスには送信できません、
としようと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

新しいRFC案を公開して、みんなの同意を取り付けてから対応して下さい。それ以外は迷惑です。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.83%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    18251questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • WordPress

    6226questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

  • 正規表現

    707questions

    正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。