本文介绍在 laravel 中使用通知(notification)批量发送邮件时,如何通过 try-catch 捕获异常,避免单个邮件发送失败导致整个 foreach 循环中断,确保其余用户仍能正常接收邮件。
在 Laravel 应用中,当需要向多个用户批量发送欢迎邮件(如注册成功后群发 MailBienvenida 通知)时,若某位用户的邮箱格式错误、SMTP 连接超时、收件箱满或 DNS 解析失败,Laravel 默认会抛出 Swift_TransportException、InvalidArgumentException 或其他 Throwable 异常,导致整个 foreach 循环立即终止——这显然不符合高可用性场景的需求。
解决思路非常明确:将每一封邮件的发送操作包裹在独立的 try-catch 块中,捕获所有可恢复的错误(包括异常与 PHP 7+ 的 Error),记录日志后主动 continue,保障循环持续执行。
假设你正在控制器中批量触发通知:
use Illuminate\Support\Facades\Log;
$users = User::where('status', 'active')->get();
foreach ($users as $user) {
try {
$user->notify(new MailBienvenida($user->name, $user->activation_code));
} catch (\Throwable $e) {
// 记录具体失败原因和用户标识,便于后续排查
Log::warning('MailBienvenida failed for user ID: ' . $user->id, [
'email' => $user->email,
'exception' => $e->getMessage(),
'trace' => $e->getTraceAsString()
]);
// 继续处理下一个用户,不中断循环
continue;
}
}? 注意:此处使用 \Throwable 而非 \Exception,是为了同时捕获传统异常(Exception)和 PHP 7+ 引入的致命错误子类(如 TypeError、ParseError),确保覆盖所有可恢复的运行时问题。
关键注意事项通过以上方式,你既能保持代码健壮性,又能实现“尽力而为”的邮件分发策略——单点故障不再成为全局瓶颈,真正践行了现代 Web 应用的容错设计原则。