使用AWS SES SMTP发送重置邮件触发Swift_RfcComplianceException错误
问题分析与解决方案
问题回顾
用Mailtrap这类普通SMTP时邮件发送正常,但切换到AWS SES生产级SMTP后,执行密码重置操作触发Swift_RfcComplianceException,错误信息:Address in mailbox given [] does not comply with RFC 2822, 3.6.2。但直接调用Mail::send()能正常发信。
核心原因
AWS SES对邮件地址的RFC合规性校验比普通SMTP严格得多,空地址(无论是收件人还是发件人)都会直接触发报错,而普通SMTP可能会忽略这类问题。
排查与解决步骤
1. 确认密码重置流程的收件人邮箱是否为空
Laravel默认密码重置逻辑依赖用户提交的邮箱,如果前端没传对参数,或者后端没正确获取,就会导致收件人地址为空。
- 打开
ForgotPasswordController,在sendResetLinkEmail方法里加调试代码,查看$request->email是否有值:public function sendResetLinkEmail(Request $request) { $this->validateEmail($request); // 临时调试,确认邮箱参数是否正确获取 dd($request->email); // ... 原有逻辑 } - 检查前端表单的邮箱输入框
name属性是否为email,确保请求参数能正确传到后端。
2. 检查邮件配置的发件人地址
AWS SES要求发件人地址必须是已验证的域名或邮箱,且绝对不能为空。
- 打开
.env文件,确认以下配置:
若MAIL_FROM_ADDRESS=verified@your-domain.com # 必须是SES控制台已验证的邮箱/域名 MAIL_FROM_NAME="${APP_NAME}"MAIL_FROM_ADDRESS为空或未通过SES验证,修改后重新测试。
3. 排查自定义密码重置邮件的逻辑
如果自定义了密码重置的Mailable类或邮件视图,可能不小心留了空的收件人/抄送地址:
- 查看
config/auth.php里的密码重置配置,找到对应的邮件类:'passwords' => [ 'users' => [ // ... 其他配置 'email' => 'App\Notifications\ResetPassword', // 或者视图路径 ], ], - 如果是自定义Mailable,检查
build方法里的收件人设置:public function build() { // 确认$this->user->email不是空值 return $this->to($this->user->email) ->subject('重置密码通知') ->view('emails.password.reset'); }
4. 临时验证:用Mail::send模拟重置流程
在ForgotPasswordController里替换原有逻辑,手动调用Mail::send测试:
public function sendResetLinkEmail(Request $request) { $this->validateEmail($request); $email = $request->email; // 手动发送测试邮件 Mail::send('auth.emails.password', ['token' => 'test-token'], function ($message) use ($email) { $message->to($email)->subject('重置密码'); }); return back()->with('status', '测试邮件已发送'); }
如果手动发送成功,说明问题出在Laravel默认重置流程的邮件通知构建环节,需要检查Illuminate\Auth\Notifications\ResetPassword类的实现,确认它能正确获取用户邮箱。
内容的提问来源于stack exchange,提问作者urfusion
相关产品推荐
相关产品推荐

