Laravelのメールアドレスのチェックについて。
概要
昔いphpの言語(ウェブシステム)を始めた時から入力チェックでEmailのチェックが一番悩まされました。
実際入力されたメールアドレスへユーザーの完了メールを送るのが多かったので、正常ではないメールアドレスでRejectメールが管理者アカウントに溜まる気持ち悪い経験をしていました。
こんな事考えていた
じゃ、そうしたらメール形式が合うかどうかと別途チェックが必要ではないか?
参考:メールアドレスを王大人先生に確認してもらう方法(精度に若干の難あり?) | 日記の間 | あかつきのお宿
まとめるとメールのドメイン部分を実際DNSに存在していて、MXレコードが登録されているかのチェックすることです。
上記の記事はscoketで25ポートで実際使っているかもチェックしています。
Laravel
ではLaravelのValidatorに追加しよう〜〜と思ったら、既にある!!
Laravel5.8.33のアップデートで追加されたらしいです。5.8の変更項目はみたが...
前提
この機能を使うためにはいくつかPHPのintl拡張機能が必要です。
Dockerでのintlをインストール方法は以下の記事をご参考してください。
メールチェック
追加された機能は以下の物です。
email:rfc
RFCと呼ばれるインターネットの標準仕様に合っているかをチェックするバリデーションです。(パッケージの説明では、RFC 5321, 5322, 6530, 6531, 6532が対象となっています)
簡単に言うとメールアドレスの形式があっているかのチェックようです。
te@st@example.com -> X test@example.com -> O
関連クラス:Egulias\EmailValidator\Validation\RFCValidation
email:strict
先ほどの、email:rfcをより厳格にしてもので「エラーだけでなく、警告があってもダメ」なバリデーションになっています。
$email = str_repeat('x', 254).'@example.com'; // xが254個で長すぎる
関連クラス:Egulias\EmailValidator\Validation\NoRFCWarningsValidation
email:dns
DNSにそのメールアドレスのドメインが存在するかをチェックするバリデーションです。例えば、example.comというドメインは存在していますがtest.example.comというものは存在していません。
こちらが実際DNS情報をみて判定するものです。
関連クラス:Egulias\EmailValidator\Validation\DNSCheckValidation
email:spoof
なりすましのメールアドレスは拒否するバリデーションです。 例えば、test@exаmple.comというメールアドレスは見た目は妥当なように見えますが、実はこれは英語のexampleではなく、аに「キリル文字」が使われた偽装ドメインになっています。
関連クラス:Egulias\EmailValidator\Validation\SpoofCheckValidation
email:filter
PHP関数のfilter_var()を使ったメールアドレスのチェックです。
関連クラス:Egulias\EmailValidator\Validation\SpoofCheckValidation
バリデーションは併用できる
Laravelで以下の使い方だとデフォルトではRFCValidation(email:rfc)が適用されます。
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
おすすめの使い方としては以下のように使った方がいいかと思います。
'email' => ['required', 'string', 'email:strict,dns,spoof', 'max:255', 'unique:users'],
結論
Laravelすごい〜〜〜〜!!