Laravel 5.5通过Mailgun发送邮件时如何捕获错误?
好问题!在Laravel 5.5里,要捕获Mailgun的发送错误,你得借助异常处理机制——因为当Mailgun API返回错误时,Laravel底层依赖的SwiftMailer会抛出对应的异常。下面是具体的实现方案,直接把你的代码改造一下就行:
try { Mail::send('emails.sendmessage', $data, function($message) use ($data) { $message->to($data['email']); $message->from('me@example.com', 'User'); // 注意你原代码里邮箱多写了一个.com,这里帮你修正了 $message->subject('Sample Email'); }); return response()->json([ 'error' => false, 'status_code' => 200, 'response' => 'success', ]); } catch (\Swift_TransportException $e) { // 专门捕获Mailgun相关的传输错误(比如API密钥无效、收件人地址非法、配额不足等) $errorDetails = $e->getMessage(); // 可选:把错误日志记录到Laravel日志文件里,方便后续排查 \Log::error('Mailgun邮件发送失败:' . $errorDetails); return response()->json([ 'error' => true, 'status_code' => 500, 'response' => '邮件发送失败', 'details' => $errorDetails // 开发环境可以返回细节,生产环境建议隐藏该字段,只给用户友好提示 ], 500); } catch (\Exception $e) { // 兜底捕获其他非Mailgun相关的错误(比如视图文件不存在、$data字段缺失等) \Log::error('邮件发送流程出现未知错误:' . $e->getMessage()); return response()->json([ 'error' => true, 'status_code' => 500, 'response' => '发送失败,请稍后重试' ], 500); }
关键说明:
Swift_TransportException是Mailgun发送失败时最常抛出的异常,它会包含Mailgun API返回的具体错误描述(比如550 Invalid recipient)。- 用
Log::error()记录错误是好习惯,后续可以在storage/logs/laravel.log里查看详细报错信息,方便定位问题。 - 生产环境中,建议不要把
details字段返回给前端,避免暴露敏感的服务器或API信息,只保留友好的提示文案即可。
内容的提问来源于stack exchange,提问作者user779681
相关产品推荐
相关产品推荐

