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が返ってくるところまで突き止めました。
php
1 switch ($patternselect) { 2 case 'pcre8': 3 /** 4 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains. 5 * @link http://squiloople.com/2009/12/20/email-address-validation/ 6 * @copyright 2009-2010 Michael Rushton 7 * Feel free to use and redistribute this code. But please keep this copyright notice. 8 */ 9 return (boolean)preg_match( 10 '/^(?!(?>(?1)"?(?>\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\[ -~]|[^"])"?(?1)){65,}@)' . 11 '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(((?>(?2)' . 12 '(?>[\x01-\x08\x0B\x0C\x0E-\'*-[]-\x7F]|\[\x00-\x7F]|(?3)))*(?2))))+(?2))|(?2))?)' . 13 '([!#-\'*+/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-[]-\x7F]|\[\x00-\x7F]))*' . 14 '(?2)")(?>(?1).(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' . 15 '(?>(?1).(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' . 16 '|(?!(?:.*[a-f0-9][:]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' . 17 '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' . 18 '|[1-9]?[0-9])(?>.(?9)){3}))])(?1)$/isD', 19 $address 20 ); 21 case 'pcre': 22 //An older regex that doesn't need a recent PCRE 23 return (boolean)preg_match( 24 '/^(?!(?>"?(?>\[ -~]|[^"])"?){255,})(?!(?>"?(?>\[ -~]|[^"])"?){65,}@)(?>' . 25 '[!#-\'*+/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-[]-\x7F]|\[\x00-\xFF]))*")' . 26 '(?>.(?>[!#-\'*+/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-[]-\x7F]|\[\x00-\xFF]))*"))*' . 27 '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>.(?![a-z0-9-]{64,})' . 28 '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' . 29 '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' . 30 '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' . 31 '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' . 32 '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' . 33 '|[1-9]?[0-9])(?>.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))])$/isD', 34 $address 35 );
ここまで仕上がっていると、安易に正規表現に手を付けることが出来ず、
上記のようなメールアドレスを許可するように変更を加えるには
どのような変更を加えればよいでしょうか。
ご意見・ご指摘を頂いた件について補足させていただきます。
RFC規約違反のメールアドレスを送受信に使ってはいけない、
至極当然なご意見です。
本来遵守するべきことです。
この現象を発見したときに上司に報告したところ、
(RFC云々を知らない上司から)送信できるようにしろとの指示を受けたこともあり、
送信できるようにWordPressのソースコードをいじってでも対策しなければならないものと考えていました。
ですが、
RFC規約違反であり、送受信・中継サーバーに迷惑をかける恐れがあるとのご指摘で、
不達になりうる可能性も高いということで、
判定を甘くして送信しようとするのはやめようと思います。

回答5件
あなたの回答
tips
プレビュー