クリエイター:メタボ兔

ウェブやアプリの開発者で利用する色な技術やサーバーや開発環境の設定について共有する場

Laravelのメールアドレスのチェックについて。

概要

昔いphpの言語(ウェブシステム)を始めた時から入力チェックでEmailのチェックが一番悩まされました。

実際入力されたメールアドレスへユーザーの完了メールを送るのが多かったので、正常ではないメールアドレスでRejectメールが管理者アカウントに溜まる気持ち悪い経験をしていました。

こんな事考えていた

じゃ、そうしたらメール形式が合うかどうかと別途チェックが必要ではないか?

参考:メールアドレスを王大人先生に確認してもらう方法(精度に若干の難あり?) | 日記の間 | あかつきのお宿

norm-nois.com

まとめるとメールのドメイン部分を実際DNSに存在していて、MXレコードが登録されているかのチェックすることです。

上記の記事はscoketで25ポートで実際使っているかもチェックしています。

Laravel

ではLaravelのValidatorに追加しよう〜〜と思ったら、既にある!!

Laravel5.8.33のアップデートで追加されたらしいです。5.8の変更項目はみたが...

blog.capilano-fw.com

前提

この機能を使うためにはいくつかPHPintl拡張機能が必要です。

Dockerでのintlをインストール方法は以下の記事をご参考してください。

qiita.com

メールチェック

追加された機能は以下の物です。

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すごい〜〜〜〜!!