概要 Email アドレスのフォーマットチェックとして PHP には検証フィルタが用意されています。
こんな使い方しますね。
1 2 3 4 5 if (filter_var($email, FILTER_VALIDATE_EMAIL)) { echo '(^-^) OK Email アドレスフォーマットとして妥当' ; } else { echo '(>_<) NG' ; }
以下 php.net ではこのように記述されている。
http://php.net/manual/ja/filter.filters.validate.php
値が妥当な e-mail アドレスであるかどうかを検証します。 この検証は、e-mail アドレスが RFC 822 に沿った形式であるかどうかを確かめます。 ただし、コメントおよび空白の折り返し (whitespace folding) には対応していません。
検証
結果 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 [OK (^-^) EMAIL LIST] abc@gmail.com a!bc@gmail.com a#bc@gmail.com a$bc@gmail.com a%bc@gmail.com a&bc@gmail.com a`bc@gmail.com a=bc@gmail.com a~bc@gmail.com a~bc@gmail.com a|bc@gmail.com a^bc@gmail.com a*bc@gmail.com a+bc@gmail.com a?bc@gmail.com a`bc@gmail.com a{bc@gmail.com a}bc@gmail.com a}bc@gmail.com !abc@gmail.com #abc@gmail.com $abc@gmail.com %abc@gmail.com &abc@gmail.com =abc@gmail.com ~abc@gmail.com |abc@gmail.com ^abc@gmail.com *abc@gmail.com +abc@gmail.com ?abc@gmail.com `abc@gmail.com {abc@gmail.com }abc@gmail.com a__bc@gmail.com abc_@gmail.com abc@vwx.yz [NG (>_<) EMAIL LIST] a"bc@gmail.com a@bc@gmail.com a(bc@gmail.com a)bc@gmail.com a\bc@gmail.com a:bc@gmail.com a;bc@gmail.com a<bc@gmail.com a>bc@gmail.com a>bc@gmail.com a,bc@gmail.com a[bc@gmail.com a]bc@gmail.com ¥abc@gmail.com "abc@gmail.com @abc@gmail.com (abc@gmail.com )abc@gmail.com \abc@gmail.com :abc@gmail.com ;abc@gmail.com <abc@gmail.com >abc@gmail.com ,abc@gmail.com [abc@gmail.com ]abc@gmail.com a..bc@gmail.com abc.@gmail.com abc@@vwx.yz
NGとしたいような Emailアドレス を通してしまいます。
&abc@xyz.ab
これまでの評価 PHP 検証フィルタ FILTER_VALIDATE_EMAIL によるバリデーションは 社内システムで利用するアカウントでのEmailアドレス検証程度であれば利用可能か。
商用サービスとして検証フィルタのみでバリデーションするのは危険かなと思いました。
マイ Email バリデーション
検証フィルタ FILTER_VALIDATE_EMAIL はベーシックに利用
利用できる文字を 半角英数字 . _ - に制限
Qiita 記事を参照しDNS 検証チェック入れました。 (ShibuyaKosuke さんありがとうございます!)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 function checkEmailwithDNS ($email, $check_dns = false) { switch (true ) { case !filter_var($email, FILTER_VALIDATE_EMAIL): case !preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/" , $email): case !preg_match('/@([\w.-]++)\z/' , $email, $m): return false ; case !$check_dns: case checkdnsrr($m[1 ], 'MX' ): case checkdnsrr($m[1 ], 'A' ): case checkdnsrr($m[1 ], 'AAAA' ): return true ; default : return false ; } } if (checkEmailDNS($email, true )) { echo '(^-^) OK Email アドレスフォーマットとして妥当' ; } else { echo '(>_<) NG' ; }
マイ Email バリデーション検証
結果 ほぼ弾いてくれます〜
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 [OK (^-^) EMAIL LIST] abc@gmail.com a__bc@gmail.com abc_@gmail.com [NG (>_<) EMAIL LIST] a!bc@gmail.com a"bc@gmail.com a@bc@gmail.com a#bc@gmail.com a$bc@gmail.com a%bc@gmail.com a&bc@gmail.com a`bc@gmail.com a(bc@gmail.com a)bc@gmail.com a=bc@gmail.com a~bc@gmail.com a~bc@gmail.com a|bc@gmail.com a\bc@gmail.com a^bc@gmail.com a:bc@gmail.com a;bc@gmail.com a*bc@gmail.com a+bc@gmail.com a?bc@gmail.com a<bc@gmail.com a>bc@gmail.com a>bc@gmail.com a,bc@gmail.com a`bc@gmail.com a[bc@gmail.com a]bc@gmail.com a{bc@gmail.com a}bc@gmail.com a}bc@gmail.com ¥abc@gmail.com !abc@gmail.com "abc@gmail.com @abc@gmail.com #abc@gmail.com $abc@gmail.com %abc@gmail.com &abc@gmail.com (abc@gmail.com )abc@gmail.com =abc@gmail.com ~abc@gmail.com |abc@gmail.com \abc@gmail.com ^abc@gmail.com :abc@gmail.com ;abc@gmail.com *abc@gmail.com +abc@gmail.com ?abc@gmail.com <abc@gmail.com >abc@gmail.com ,abc@gmail.com `abc@gmail.com [abc@gmail.com ]abc@gmail.com {abc@gmail.com }abc@gmail.com a..bc@gmail.com abc.@gmail.com abc@@vwx.yz abc@vwx.yz
参照 そろそろメールアドレスを正規表現だけでチェックするのは終わりにしませんか?
以上です。