必须完成驱动配置、渠道注册、队列启动三步闭环;缺一不可,否则邮件静默失败:需正确设置.env中MAIL_MAILER并清缓存,通知类via()返回['mail'],且启用ShouldQueue并运行queue:work。

要在Laravel应用中让邮件通知真正发出去,必须完成驱动配置、渠道注册、队列启动三步闭环,缺一不可;只改.env不清理缓存、只写通知类不指定via()、只调用notify()不运行队列,都会导致邮件静默失败。
确认并启用邮件驱动
打开 .env 文件,将 MAIL_MAILER 设置为 smtp(或 mailgun、postmark 等),同时填入对应凭证:
【MAIL_USERNAME 必须是完整邮箱地址,例如 user@qq.com,不是“user”】
修改后执行 php artisan config:clear,否则 Laravel 仍读取旧缓存配置。
验证是否生效:运行 php artisan tinker → 输入 config('mail.default'),返回值应与 .env 中 MAIL_MAILER 一致。
创建通知类并指定邮件通道
执行命令生成通知类:php artisan make:notification OrderConfirmed
编辑 app/Notifications/OrderConfirmed.php,在 via() 方法中明确返回 ['mail']:
若遗漏此行,Laravel 默认只启用 database 和 broadcast 渠道,【邮件根本不会被触发】
在 toMail($notifiable) 方法中使用 $notifiable->routeNotificationFor('mail') 获取收件地址,而非直接访问 $notifiable->email —— 模型字段名变更时此写法会失效。
配置视图并测试发送
方法一:使用 MailMessage 构建轻量邮件
在 toMail() 中返回 (new MailMessage)->subject('订单已确认')->line('感谢您的购买。'),无需额外视图文件。
方法二:使用 Blade 视图渲染复杂内容
创建 resources/views/emails/order-confirmed.blade.php,确保该路径与 ->view('emails.order-confirmed') 严格匹配;路径错误会导致白屏且无报错。
测试发送:在 tinker 中执行 App\Models\User::first()->notify(new App\Notifications\OrderConfirmed);,观察日志或 MailHog 是否捕获到消息。
启用队列确保异步可靠投递
第一步:在 config/queue.php 中确认默认连接(如 redis 或 database)已启用。
第二步:运行迁移创建队列表:php artisan queue:table && php artisan migrate。
第三步:修改通知类,添加 implements ShouldQueue 并 use Queueable trait。
第四步:启动监听器:php artisan queue:work --queue=notifications —— 【若未运行此命令,所有带队列的通知将永久滞留在 jobs 表中】


















