- カテゴリ: 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 はフォーム入力がメールアドレス書式に適合するかを判定するバリデーションルールです。用途に応じて rfc、strict、dns、spoof、filter のサブオプションを組み合わせ、厳格さや追加チェック(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 のサブオプション)
| 引数 | 型 | 必須 | 既定値 | 説明 |
|---|---|---|---|---|
| rfc | string | – | 有効 | RFC 準拠の検証(標準的な厳格さ) |
| strict | string | – | 無 | RFC 準拠に加え厳格化(軽微な警告も不許可) |
| dns | string | – | 無 | ドメインに MX または A レコードが存在するか確認 |
| spoof | string | – | 無 | なりすまし・見かけ類似文字の検出(intl 依存) |
| filter | string | – | 無 | filter_var(..., FILTER_VALIDATE_EMAIL) による緩めの検証 |
- 戻り値:
bool(妥当なら true) - 例外/副作用:
dnsはdns_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:filter | email: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拡張がないと判定が不安定。環境を揃える。 - 厳格すぎ問題:
strictやspoofは誤検知の可能性。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 を併用 |
参考リンク
- Laravel — Validation(Email ルール): https://laravel.com/docs/validation
- egulias/email-validator(GitHub): https://github.com/egulias/EmailValidator
- PHP
filter_var— FILTER_VALIDATE_EMAIL: https://www.php.net/manual/en/filter.filters.validate.php - PHP
dns_get_record: https://www.php.net/manual/en/function.dns-get-record.php

