この記事には広告を含む場合があります。
記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。
PHPにてメールアドレスのチェック
サービスで利用するときのメールアドレスの判定方法を紹介します。
メールアドレスの判定方法は10年以上前からあり、多くのサイトは正規表現である「preg_match」を利用したものでした。しかし「preg_match」の正規表現は、RFCに準拠したものしなかったものを含めて記述された人ごとに差異がありました。
php5.2からfilter_var関数が登場したので、メールアドレスを高速に判定できるようになりましたが、RFC準拠の判定となります。
docomoとauのメールアドレスは、2009年ごろまでRFCに準拠しない「.(ドット)」の連続などを許容していたため、filter_var関数だけだと該当のメールアドレスが拒否されてしまいます。
私の運用していたサービスにて、docomoとauのRFC違反のユーザーが数千人ほど残っているサービスもあります。該当のユーザーを切り捨てることは、サービスとして行いたくないという思想の元にサンプルコードはできています。
サンプルプログラム
メールアドレスの判定を行い、docomoとauのRFC違反のユーザーを救済する判定を実装しています。
<?php
$checkList = [
'hogehoge@example.com',
'hogehoge..123.@example.com',
'hogehoge.123..@example.com',
'hogehoge.123..@docomo.ne.jp',
'hogehoge.123..@ezweb.ne.jp'
];
foreach($checkList as $email) {
if(isEmail($email)) {
echo 'ok:' . $email . PHP_EOL;
} else {
echo 'ng:' . $email . PHP_EOL;
}
}
/**
* 正しいメールアドレスであるかの判定
* @param $email メールアドレス
* @return 判定結果
*/
function isEmail($email)
{
//大抵のメールアドレスはこれで問題なし
if(filter_var($email, FILTER_VALIDATE_EMAIL)) {
return true;
}
//RFC違反のメールアドレスがあるdocomoとauだけ、救済チェックを行う
if(strpos($email, '@docomo.ne.jp') !== false || strpos($email, '@ezweb.ne.jp') !== false) {
$pattern = '/^([a-zA-Z])+([a-zA-Z0-9\._-])*@(docomo\.ne\.jp|ezweb\.ne\.jp)$/';
if(preg_match($pattern, $email, $matches) === 1) {
return true;
}
}
return false;
}
サンプルプログラムの出力結果
[root@localhost]$ php isEmail.php ok:hogehoge@example.com ng:hogehoge..123.@example.com ng:hogehoge.123..@example.com ok:hogehoge.123..@docomo.ne.jp ok:hogehoge.123..@ezweb.ne.jp
携帯キャリアのメールアドレスで利用できる文字
サンプルプログラムに関連して、携帯キャリアのメールアドレスにて利用できる文字の一覧を記載します。各キャリアとも使える文字は英数字、「-」(ハイフン)、「.」(ドット)、「_」(アンダーバー)です。
| 携帯キャリア | 文字数 | 使える記号 |
|---|---|---|
| docomo | 3~30文字 | 「-」(ハイフン)、「.」(ドット)、「_」(アンダーバー) |
| au | 30文字まで | 「-」(ハイフン)、「.」(ドット)、「_」(アンダーバー) |
| softbank | 3~30文字 | 「-」(ハイフン)、「.」(ドット)、「_」(アンダーバー) |
参考サイト(各キャリアのメールアドレスで使える文字を記載したURL)
docomo:https://www.nttdocomo.co.jp/info/spam_mail/change_add/
au:https://www.au.com/support/service/mobile/trouble/mail/email/change/
softbank:https://www.softbank.jp/support/faq/view/10544


