九保すこひです(フリーランスのITコンサルタント、エンジニア)
さてさて、Laravelは短い期間でアップデートされているわけですが、たまに大きな機能拡張の追加があったりもするので、マイナーアップデートであっても見逃さないようにしています。
そして、先日バージョン5.8.33へのアップデートではメールアドレスの新しいバリデーションが追加になりました。
これはずっと前から言われていることなのですが、メールアドレスは一定の法則があるようで、実は正規表現で「有効 or 無効」をチェックするのは難しかったりします。(確か完璧には不可能だった気がします😫)
しかし、今回のアップデートでは、egulias/email-validatorというパッケージを使って様々な角度から「メールアドレスの妥当性チェック」ができるようになりましたので、早速それらを試してみることにしました!
ぜひ皆さんの参考になると嬉しいです😊✨

開発環境: Laravel 5.8.33
目次
前提として
今回追加されたメールアドレス用バリデーションでは、いくつかPHPの拡張機能が必要になるものがあります。
もし、以下のようなエラーが表示されたら以降の手順で拡張機能をインストールしてから実行してみてください。(実行環境は、Ubuntu 18.04 + PHP 7.2です)

まず、自分の環境にあうパッケージを検索します。
sudo apt search intl | grep "php"
結果は以下のようなものになります。

後は、ご自身のPHPバージョンに合うphp****-intlというパッケージを選んで以下のようにインストールしましょう。
sudo apt install php7.2-intl
インストールが完了したら、ウェブサーバー(nginxの場合はphp-fpm)を再起動してください。
sudo systemctl restart php7.2-fpm
phpinfo()で確認して以下のような項目が表示されていれば成功です。

新しいメールアドレス・バリデーション
email:rfc
RFCと呼ばれるインターネットの標準仕様に合っているかをチェックするバリデーションです。(パッケージの説明では、RFC 5321, 5322, 6530, 6531, 6532が対象となっています)
実際の例は以下になります。
$data = ['email' => 'te@st@example.com'];
$validator = \Validator::make($data, [
'email' => 'email:rfc'
]);
if($validator->fails()) {
// 有効なメールアドレスではない場合
// この例はエラーになります。
}
email:strict
先ほどの、email:rfcをより厳格にしてもので「エラーだけでなく、警告があってもダメ」なバリデーションになっています。
例えば、以下のようにRFCの形式としては正しいけれども、あまりにも長過ぎるメールアドレスもチェックするバリデーションになっています。
$email = str_repeat('x', 254).'@example.com'; // xが254個で長すぎる
実際の例はこうなります。
$data = ['email' => str_repeat('x', 254).'@example.com'];
$validator = \Validator::make($data, [
'email' => 'email:strict'
]);
if($validator->fails()) {
// 有効なメールアドレスではない場合
// この例はエラーになります。
}
email:dns
DNSにそのメールアドレスのドメインが存在するかをチェックするバリデーションです。例えば、example.comというドメインは存在していますがtest.example.comというものは存在していません。
つまり、以下の例ではエラーと判断されてしまいます。
$data = ['email' => 'xxx@test.example.com'];
$validator = \Validator::make($data, [
'email' => 'email:dns'
]);
if($validator->fails()) {
// 有効なメールアドレスではない場合
// この例はエラーになります。
}
なお、ここで注意が必要なのは、このバリデーションは「ドメインが有効かどうか」をチェックするものなのでドメインさえ存在していれば有効であると判断するという部分です。
例えば、xxx.@example.comというメールアドレスは@の直前に.があるのでemail:rfcバリデーションではエラーになりますが、email:dnsのチェックでは通過してしまいます。
そのため、以下のように併用するのがいいでしょう。
$validator = \Validator::make($data, [
'email' => 'email:rfc,dns'
]);
email:spoof
なりすましのメールアドレスは拒否するバリデーションです。
例えば、test@exаmple.comというメールアドレスは見た目は妥当なように見えますが、実はこれは英語のexampleではなく、аに「キリル文字」が使われた偽装ドメインになっています。
このバリデーションではこうした偽装メールアドレスを文字コードの違いによって区別しています(内部では、Spoofcheckerを使っています)
$data = ['email' => 'test@exаmple.com'];
$validator = \Validator::make($data, [
'email' => 'email:spoof'
]);
if($validator->fails()) {
// 有効なメールアドレスではない場合
// この例はエラーになります。
}
※ メールスプーフィングについては、こちらのページのmasakielasticさんの回答が詳しいです。
email:filter
PHP関数のfilter_var()を使ったメールアドレスのチェックです。
$data = ['email' => 'test.@example.com'];
$validator = \Validator::make($data, [
'email' => 'email:filter'
]);
if($validator->fails()) {
// 有効なメールアドレスではない場合
// この例はエラーになります。
}
ちなみに:バリデーションは併用できる
途中でも書きましたが、今回の新しいバリデーションは以下のように併用することができます。
$validator = \Validator::make($data, [
'email' => 'email:strict,dns,spoof'
]);
おわりに
ということで、今回はLaravelの新しいメールアドレス・バリデーションを紹介しました。
それにしても、以前どこかで聞いたことはあったもののメールスプーフィング(偽装アドレス)の仕組みには驚きました。キリル文字には以下のような英語にとても似ている文字が存在しているようで、悲しい話ですが、これらを駆使して有名企業などになりすまして悪さをする人がいるようです。
- а ・・・ 英語の「a」ではない
- р ・・・ 英語の「p」ではない
- К ・・・ 英語の「K」ではない
しかも似ている文字はキリル文字だけじゃないですしね・・・😅。
なにはともあれ、今回のアップデートでこういったものも事前に防ぐことができるようになりましたので、ぜひ皆さんも活用してみてはいかがでしょうか。
ではでは〜!






