Field note · 使い方

2026 Laravel 13のメールテスト:Mail::fakeでメールの到達を証明できる?

Laravel 13でMail::fakeが検証できるのは、アプリケーションがメール送信を要求したことや、Mailableの内容です。送信、キュー、本文、実際の受信箱を分けて整理し、テスト目的に合う証拠の選び方を紹介します。

Mail::fakeは実際の受信ではなく、アプリの送信要求を検証します

Mail::fakeで確認できるのは、アプリケーションが期待したメールを送信、またはキューへ登録しようとしたことです。外部メール経路を通って受信箱に届いた証拠にはなりません。Laravel 13のメールテストでは、アプリの呼び出し、Mailableの内容、実際の受信を別の証拠として組み合わせます。

登録確認メールのテストが成功したのに、テスト用の受信箱には何も届かない。そんなときは、どの段階を検証したテストなのかを切り分けます。

この内容は、登録確認やパスワード再設定を実装する開発者、メール回帰テストを設計するQA担当者向けです。
また、実ユーザーへの誤送信を避けながら、ステージング環境の通知フローを確かめたい独立開発者にも役立ちます。

三つの証拠を比べると、合格の意味が変わります

検証する証拠 確認できること それだけでは確認できないこと
アプリの送信呼び出し 指定したMailableの送信要求、宛先など 外部メール経路での配送や受信
Mailableの内容 宛先、件名、本文などが期待どおりか 受信側での表示、受信箱への到達
受信箱での確認 その受信先でメールを受け取れたか 他の受信先でも同じ結果になること

この区別は、Laravel公式のメールテストと送信・キューのアサーションに沿ったものです。テスト名やCIの結果を「メール到達確認」と一括りにせず、何を証明したのか記録します。

Laravel 13のMail::fakeで、メールが実際に届いたと判断できますか。
できません。Mail::fakeは実際の送信を抑止し、テスト内でメールの送信要求を検証するための仕組みです。成功しても、外部サービスへの接続、配送処理、受信側の判定を通過したことにはなりません。詳しい対象メソッドはLaravel 13のMailFake APIで確認できます。

アプリの呼び出しとキュー投入を混同しない

登録処理のテストでは、「登録後に確認メールの送信を要求したか」を確認できます。たとえば、認証済みユーザーに送るMailableが呼び出されたことを検証します。

Mail::fake();

$this->post('/register', $registrationData);

Mail::assertSent(VerifyEmail::class);

宛先まで確認する場合は、Mailableの条件をアサーションに加えます。

Mail::assertSent(VerifyEmail::class, function (VerifyEmail $mail) use ($user) {
    return $mail->hasTo($user->email);
});

これらのアサーションが示すのは、テスト中に該当メールが送信対象になったことです。受信者のメールボックスに到達した、あるいは受信者が内容を読めた、という判定ではありません。

assertSentとassertQueuedはどう使い分けますか。
同期送信の経路を検証するならassertSent、キュー投入を予定した経路ならassertQueuedを使います。キュー用のアサーションは、メールがキューに登録されたことを検証します。キューワーカーがその後ジョブを処理し、外部へ送信したことまでは証明しません。メールとキューの境界はLaravelのキューに関する公式ドキュメントでも確認できます。

実装・テスト対象 主に使うアサーション 合格時に言えること
その場で送信する処理 assertSent メール送信が要求された
キューに載せる処理 assertQueued メールがキュー対象になった
キュー投入そのものの確認 Queue fakeのアサーション 対象ジョブの登録を検証した

キューを使う処理では、リクエストが成功しただけでバックグラウンド処理の完了とみなさないようにします。メールのキュー判定とキュージョブの判定を分ける必要がある場合は、Laravel 13のQueueFake APIも参照してください。

Mailableの検査と受信画面の確認は別の指標です

「メールを送る処理が呼ばれた」だけでは、件名が正しいか、本文のリンクが期待どおりかはわかりません。Laravel Mailablesを個別に検査し、宛先や件名、本文に含まれる文字列などを確認すると、送信要求のテストと内容のテストを分離できます。

Laravel公式のメールテスト手順では、Mailableを生成して内容を検査する方法が示されています。たとえば、本文に必要な文言があるか、期待した件名や宛先になっているかを確認します。利用可能な検査メソッドはLaravel 13のAPIドキュメント索引で対象クラスとあわせて確認してください。

Laravel Mailablesの宛先や内容はどこまで検査できますか。
Mailableのテストでは、宛先、件名、本文に期待する内容が含まれるかなどを確認できます。HTML本文を検査しても、実際のメールクライアントでの描画や、外部の受信箱への到達を確かめたことにはなりません。リンク先やテンプレートの変更を検出するテストと、受信後の表示確認は別に設計します。

実際の受信確認が必要なときだけ、管理された受信先を加える

ローカルのメール捕捉環境は、生成されたメッセージを確認するのに便利です。ただし、アプリ内で生成したメールを見られることと、外部の受信箱で受け取れたことは異なります。受信先を含む実環境に近い確認が要件なら、テスト専用の受信アドレスで実際に受信し、本文の可読性とリンクの遷移先を確認します。

その結果が証明するのは、そのテスト条件と受信先でメールを確認できたことです。別のメールサービスや設定でも必ず届く、という一般的な保証には広げられません。テスト用の受信先を選ぶときは、受信アドレスの選び方も参考にし、実ユーザーや第三者のアドレスをテストに流用しないようにします。

いつテスト用の受信箱で実受信まで確認すべきですか。
受け取った後の表示やリンク、外部経路を含む動作が受け入れ条件に入る場合です。送信ロジックだけが対象なら、Mail::fakeとMailable検査で目的を満たせることがあります。どの段階を試験したのかをテスト結果に明記し、受信箱での確認をすべての単体テストに無条件で追加しないようにします。

目的から検証方法を選ぶ条件分岐

  • 業務処理がメール送信を要求するかを知りたい場合は、Mail::fakeと送信アサーションを選びます。宛先も条件に含めれば、誤ったユーザーへの送信要求を検出できます。
  • 件名や本文、確認リンクなどの内容が要件に合うかを知りたい場合は、Mailableの内容検査を追加します。送信アサーションだけで内容の正しさを推定しません。
  • キューを使う設計の場合は、送信アサーションではなくキュー投入のアサーションを選びます。さらにワーカー処理までが検収対象なら、その処理を検証する試験を別に用意します。
  • 外部受信箱に届くことが要件の場合は、管理されたテスト用アドレスで実受信を確認します。Mail::fakeやローカル捕捉だけで代用しません。
  • 長期的なアカウント復旧や返信が必要な場合は、一時的な受信先ではなく、管理下にある継続利用のメールアドレスを使います。

テストデータに実在する個人のアドレスを混ぜない運用も重要です。登録フローの分離やテストアカウントの扱いは、登録時のプライバシー確認ガイドに沿って整理できます。

受信確認を加えるなら、テスト専用アドレスを使います

Laravel 13のメールテストでは、アプリの送信要求、Mailableの内容、受信箱での実受信を別の合格条件として扱います。Mail::fakeはアプリケーション側の検証に有効ですが、メールの到達を保証する仕組みではありません。

外部受信まで確認する回帰テストでは、受信を管理できるテスト用アドレスを用意します。個人の主アドレスを登録テストへ使わずに済む選択肢として、登録なしですぐ使える一時受信先のFwdTmpもあります。実際の到達確認は受信箱で行い、長期利用やアカウント復旧に必要なメールには継続管理できるアドレスを選びます。

公開を減らして始める

次の登録は、まっさらな受信トレイから始めましょう。