# Laravel Email バリデーションについて

仕事でメールアドレス登録する作業がありましたが、Laravel のデフォルト Validation 使って Email をチェックしたところ、通常では使えるメールアドレスがバリデーションに引っかかってエラーになりました。
そして、Laravel デフォルトの Email バリデーションルール機能について調査しましたので、メモります。

環境

  • php 8.1
  • Laravel 9

# Email Validation 通常の使い方

// |区切りで定義
$validated = $request->validate([
    'email' => 'required|unique:posts|email|max:254|regex:/\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i',
    'name' => 'required|max:125',
]);

// 配列指定
$validated = $request->validate([
    'email' => ['required','unique:posts','email','max:254','regex:/\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i'],
    'name' => ['required','max:125'],
]);

バリデーションエラーになった場合、自動的にバリデーションルールに沿って文書化したメッセージを返却してくれます。

使用可能なバリデーションルール (opens new window)

# 問題点

laravel+email@gmail.comのような特殊記号が入ったメールアドレスはバリデーションに引っ掛かります。
test@あいうえお.comのような日本語が含むメールアドレスは正常に登録できません。

email validation のデフォルトでは以下のような不正メールアドレスが通ってしまいます。

  • example@gmailcom(ドット抜け)
  • example@gmail(.com 抜け)
  • example @gmail.com(半角スペース)
  • example.@gmail.com(@マーク前にドット)
  • example.@gmail.co(存在しないドメイン)

# 解決方法

email:strict,dns,spoof email のオプションスタイルを使います!

// |区切りで定義
$validated = $request->validate([
    'email' => 'required|unique:posts|email:strict,dns|max:254',
    'name' => 'required|max:125',
]);

// 配列指定
$validated = $request->validate([
    'email' => ['required','unique:posts','email:strict,dns','max:254'],
    'name' => ['required','max:125'],
]);

# Email validation フィールドの作業内容

Email バリデーションルールはメールアドレスの検証に egulias/email-validator (opens new window) パッケージを使用しています。
デフォルトでは RFCValidation バリデータが適用されますが、他のバリデーションスタイルも適用可能です。

5種類のバリでションスタイル

  • rfc: RFCValidation
  • strict: NoRFCWarningsValidation
  • dns: DNSCheckValidation
  • spoof: SpoofCheckValidation
  • filter: FilterEmailValidation

# email:rfc RFCValidation

RFC と呼ばれるインターネットの標準仕様に合っているかをチェックするバリデーションです。(パッケージの説明では、RFC 5321,5322,6530,6531,6532,1035 が対象となっています)
メールアドレスの形式があっているかのチェックします。

# email:strict NoRFCWarningsValidation

email:rfc をより厳格にしてものでエラーだけでなく、ワーニング警告もバリデーション対象になります。

# email:dns DNSCheckValidation

dns_get_record メソッド使って DNS_MX DNS_A DNS_AAAA のレコードからドメインチェック、DNS にそのメールアドレスのドメインが存在するかをチェックするバリデーションです。

# email:spoof SpoofCheckValidation

なりすましのメールアドレスは拒否するバリデーションです。 キリル文字など使って偽装ドメインを利用しているかをチェックします。

# email:filter FilterEmailValidation

PHP 関数のfilter_var()を使ったメールアドレスをチェックします。

2023-01-25
  • php
  • laravel

同じタグを持つ記事をピックアップしました。