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

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

新規登録して質問してみよう
ただいま回答率
85.49%
WordPress

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

PHP

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

正規表現

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

Q&A

解決済

5回答

3919閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

WordPress

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

PHP

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

正規表現

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

0グッド

0クリップ

投稿2018/04/20 07:47

編集2018/04/23 02:08

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

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

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

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

まあ

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

投稿2018/04/20 12:58

編集2018/04/21 02:43
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/04/21 00:15

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

退会済みユーザー

2018/04/21 02:08

> ここまで仕上がっていると、安易に正規表現に手を付けることが出来ず、 なのでソース自体を改変しようとしている
退会済みユーザー

退会済みユーザー

2018/04/23 02:11

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

0

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

投稿2018/04/20 08:58

編集2018/04/20 08:59
y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/04/20 09:13

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

退会済みユーザー

2018/04/20 11:37

gmailは送信拒否しますよ(笑)
退会済みユーザー

退会済みユーザー

2018/04/20 11:40

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

退会済みユーザー

2018/04/20 12:04

OUTLOOK.COMやExchangeも送受信を拒否してるようだ
退会済みユーザー

退会済みユーザー

2018/04/21 00:59

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

退会済みユーザー

2018/04/21 02:15

te2ji 同僚がつかってるww
退会済みユーザー

退会済みユーザー

2018/04/21 02:47

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

退会済みユーザー

2018/04/21 02:52

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

0

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

投稿2018/04/20 21:15

編集2018/04/20 21:18
hichon

総合スコア5737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

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

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

投稿2018/04/20 10:02

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/04/20 11:58

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

退会済みユーザー

2018/04/23 02:45

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

0

ベストアンサー

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

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

投稿2018/04/23 02:48

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問