email — メールアドレス形式を検証するルール

validation
  • カテゴリ: validation
  • 対応バージョン: Laravel 11/12・PHP 8.2
  • 名前空間 / FQCN / コマンド: Illuminate\Validation\Rules\Email, Illuminate\Validation\Rule / —
  • 関連: required / nullable / unique / regex / Rule::email()
  • 変更履歴: Laravel 9 で流暢(Fluent)な Rule::email() 追加。Laravel 10 以降で egulias/email-validator の更新に追従(IDN 等の検証が強化・intl 依存)。

要点(TL;DR)

  • 入力が有効なメールアドレスかを検証する。
  • 最低限: 'email'、厳格かつ到達可能性を重視: 'email:rfc,dns'
  • 罠: 空文字は nullable なしだと失敗/dns はネットワーク依存で遅延・失敗要因に。

概要

email はフォーム入力がメールアドレス書式に適合するかを判定するバリデーションルールです。用途に応じて rfcstrictdnsspooffilter のサブオプションを組み合わせ、厳格さや追加チェック(DNS・なりすまし検知)を加えられます。会員登録や問い合わせフォームでの誤入力・スパム抑制に有効です。

構文 / シグネチャ

// 文字列ルール
'field' => 'email'                  // デフォルト: RFC 準拠チェック
'field' => 'email:rfc,dns'          // RFC + DNS(MX/A) 解析
'field' => 'email:filter'           // PHPの filter_var による緩めのチェック
'field' => 'email:rfc,strict,dns,spoof' // さらに厳格

// 流暢なルール(推奨)
use Illuminate\Validation\Rule;
use Illuminate\Validation\Rules\Email as EmailRule;

'field' => [
    'required',
    Rule::email()->rfc()->dns(),         // ->strict()->spoof()->filter() も可
]

引数(email のサブオプション)

引数必須既定値説明
rfcstring有効RFC 準拠の検証(標準的な厳格さ)
strictstringRFC 準拠に加え厳格化(軽微な警告も不許可)
dnsstringドメインに MX または A レコードが存在するか確認
spoofstringなりすまし・見かけ類似文字の検出(intl 依存)
filterstringfilter_var(..., FILTER_VALIDATE_EMAIL) による緩めの検証
  • 戻り値bool(妥当なら true)
  • 例外/副作用dnsdns_get_record() を使用しネットワーク依存。コンテナ/CI・本番の名前解決設定に影響を受ける。spoof と一部の IDN 検証は PHP 拡張 intl が必要。

使用例

最小例

// Controller や FormRequest で
$request->validate([
    'email' => ['required', 'email'], // まずはこれで十分
]);

実務例(登録フォーム:到達性重視 & 一意制約)

use Illuminate\Validation\Rule;
use Illuminate\Validation\Rules\Email as EmailRule;

$request->validate([
    'email' => [
        'required',
        'string',
        Rule::email()->rfc()->dns(),          // 形式+DNSチェック
        Rule::unique('users', 'email'),       // 既存ユーザーと重複不可
    ],
    'name' => ['required', 'string', 'max:255'],
], [
    'email.email' => '有効なメールアドレス形式で入力してください。',
    'email.unique' => 'このメールアドレスは既に登録されています。',
]);

条件付き(sometimes / 空許可 nullable

$request->validate([
    'backup_email' => ['sometimes', 'nullable', Rule::email()->rfc()],
]);
// フィールドが送られて来たときだけ検証。空文字は通す。

通過/失敗ケース表(代表例)

入力例email (rfc)email:filteremail:rfc,dns
user@example.com通過通過通過(example.com は A あり)
u+tag@sub.domain.tld通過通過ドメインのDNS次第
"John..Doe"@example.com失敗(連続ドット)通過の可能性あり失敗
ユーザー@例.jp(IDN)環境依存(intl 推奨)失敗の可能性DNSにIDN対応必須
空文字(''失敗(nullable 必要)失敗失敗

迷ったら 'email:rfc' を基本に、到達性が必要なら dns を併用。

よくある落とし穴・注意

  • 空文字の扱いemail 単体では空文字は失敗。空許可なら nullable を追加。
  • DNS チェックの遅延/失敗dns はネットワークに依存し、タイムアウトで失敗することがある。大量バリデーションや同期APIでは慎重に。
  • IDN/Unicode メール例え@例.jp のような IDN は intl 拡張がないと判定が不安定。環境を揃える。
  • 厳格すぎ問題strictspoof は誤検知の可能性。B2C では弾きすぎにならないよう段階的に導入。
  • deliverability ではないdns を付けても受信可能性の保証ではない(受信拒否・一時障害等は検出不可)。

代替・関連APIとの比較

  • regex:独自パターンを許容したい場合のみ。メールは RFC が複雑なため基本は email を使用。
  • email:filter:入力ハードルを下げたい場合の妥協案。誤通過の可能性は上がる。
  • Rule::unique():登録重複を防ぐ一意性チェックとセットで使うのが実務定番。
  • required / nullable / sometimes:存在/空許可/条件付きの制御で UX を最適化。

テスト例(Pest)

use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
use Illuminate\Validation\Rules\Email as EmailRule;

it('validates email with rfc and dns', function () {
    $v = Validator::make(
        ['email' => 'user@example.com'],
        ['email' => [Rule::email()->rfc()->dns()]]
    );
    expect($v->passes())->toBeTrue();
});

it('rejects empty without nullable', function () {
    $v = Validator::make(['email' => ''], ['email' => ['email']]);
    expect($v->fails())->toBeTrue();
});

it('allows empty with nullable', function () {
    $v = Validator::make(['email' => ''], ['email' => ['nullable','email']]);
    expect($v->passes())->toBeTrue();
});

トラブルシュート(エラー別)

症状/エラー原因対処
「有効なメールアドレス形式で…」空文字だが nullable 未指定nullable を付与、もしくは required を付けて明示的に必須化
思ったより弾かれるstrict/spoof による厳格すぎまずは rfc のみから開始、段階導入
dns で時々失敗する名前解決のタイムアウト/環境差リゾルバ設定を見直す/dns を非同期化 or 保存時のみ実施
日本語ドメインで通らないintl 未導入PHP の intl 拡張を有効化
既に登録されているのに通過する書式のみ検証しているunique:users,email を併用

参考リンク

レン (Wren)

こんにちは。レンです。

Laravelのコードの森に住んでいる、小さな案内役です。
ルーティングの枝やクラスの影を歩きながら、コードの流れや仕組みを眺めています。

このサイトでは、Laravelの基本から実装のコツまで、開発で役立つポイントを静かに整理しています。
難しいことを増やすのではなく、コードの見通しが少し良くなるヒントを届けるのが役目です。

「この処理はどこに書くのがいいのか」
「Laravelではどう考えると整理できるのか」

そんな疑問に、小さなメモを残すような気持ちで記事を書いています。

コードを書いている途中で迷ったとき、
このサイトが少し立ち止まって整理できる場所になればうれしいです。

レン (Wren)をフォローする