この記事ではLaravelで行うメールアドレスのバリデーションについての記事です。
この記事を読むメリット
- Laravelでメールアドレスのバリデーションを行う方法が分かる
- Laravelが用意しているバリデーションの種類・違いが理解できる
メールアドレスのバリデーションは多くのWebアプリケーションで実装する必要のあることです。
Laravelでは便利なメールアドレスのバリデーションの方法を用意してくれていますが、それを理解していないと予期せぬバグの原因になる可能性があります。
この記事ではLaravelでのメールアドレスのバリデーションを行う方法と、方法の種類・違いについて詳しく紹介します。
メール送信処理でエラーが起きた
今回、Laravelでのメールアドレスのバリデーションについて詳しく調べるきっかけになったことがありました。
それはメールアドレスを登録したユーザーに対してメール送信を行う際にメール送信エラーが起こってしまっていたことです。
メール送信は「SendGrid」という外部のメール配信サービスを使っていました。
その際、Laravelのバリデーションを通過したメールアドレスがSendGrid側のメールアドレスチェックでは弾かれてしまい、メール送信が失敗してしまいました。
- Laravel側でメールアドレスのバリデーション→OK
- そのメールアドレス宛にSedGrid側でメール送信を行う際のバリデーション→NG
このように、「Laravel側でのメールアドレスバリデーションと外部のメール配信サービスが行うバリデーションの厳格さに差があった」ことで今回のようなメール送信の失敗が起こってしまいました。
Laravelのメールアドレスバリデーションをよくあるデフォルトのまま利用していると、今回のように外部のメール配信サービスを利用している際にエラーが起きる可能性が高くなるなと感じました。
これを踏まえて、この後の章からメールアドレスバリデーションの基本的な方法とLaravelが用意しているメールアドレスバリデーション方法の種類について紹介していきます。
エンジニアにおすすめ書籍
エンジニアになりたて、これから勉強を深めていきたいという方におすすめの書籍はこちら!
Laravelでメールアドレスのバリデーションを行う方法
まずは基本的なLaravelでのメールアドレスバリデーションの方法を紹介していきます。
public function rules()
{
return [
'email' => ['required', 'string', 'email'],
'password' => ['required', 'string'],
];
}
Laravelでデフォルトで入っている「src/app/Http/Requests/Auth/LoginRequest.php」の中身はこのようにバリデーションを実装しています。
「email」と指定するだけで、メールアドレスのバリデーションを行ってくれます。
そしてこのバリデーション方法はデフォルトで「RFC仕様に合っているかのチェック」になります。
世界共通となるインターネット通信規格RFC(Request for Comments)に準拠していないメールアドレスは弾かれるようになります。
Laravelでバリデーションの方法を変更する
デフォルトでは先ほど紹介したRFC仕様に合っているかのチェックを行うだけでしたが、Laravelは他のバリデーション方法も用意しています。
- rfc:RFC仕様に合っているかチェック(デフォルトはこれ)
- strict:RFCチェックの警告も弾く
- dns:DNSの存在をチェック
- spoof:なりすましをチェック
- filter:PHP関数のfilter_var()を使ったメールアドレスのチェック
1点注意点として、「dns」「spoof」のバリデータには、PHPのintl拡張が必要になります。
intl拡張をインストールを行わないとバリデーションを実行する際にエラーが発生するので使用する際はインストールしましょう。
それぞれのバリデーション方法の組み合わせも可能
これらのバリデーションの方法は組み合わせて併用が可能です。
public function rules()
{
return [
'email' => ['required', 'string', 'email:strict,dns,spoof'],
'password' => ['required', 'string'],
];
}
上の例では「strict,dns,spoof」の3つのバリデーションをすべて適用させることができています。
要件に合わせてメールアドレスのバリデーション方法を決める
今回メールアドレス送信をエラーをきっかけにバリデーションについて詳しく調べました。
どこまでメールアドレスバリデーションを厳格に設定するかはアプリの要件などによって変わってくるかと思います。
厳格にしすぎて存在するはずのメールアドレスも弾いてしまったということも起きる可能性もあるので。
今回の私の例のようにメールアドレスの登録とメール送信のバリデーションレベルが揃っていないとエラーが発生してしまいます。
特に外部のメール配信サービスを利用している際は注意すると良いかと思います。