Laravel发送邮件遇RFC 2822地址合规错误,刷新重提交却正常
问题解决:Laravel 5.5 发送邮件偶发RFC 2822地址错误
问题现象
点击HTML表单按钮触发邮件发送时,频繁出现错误:Address in mailbox given [] does not comply with RFC 2822, 3.6.2,但刷新重提交表单后邮件可正常发送,约40次尝试中有1次能直接成功。已尝试用trim()处理邮箱、将邮箱放入数组传入to(),均无效。
核心原因排查
报错提示邮箱地址为空,大概率是发件人地址(from)未正确获取。你代码中使用env("MAIL_FROM_ADDRESS")获取发件人地址,Laravel在生产环境会缓存配置文件,导致env()函数无法实时读取到正确值,偶尔出现空值情况。
解决方案
1. 替换env()为config()读取配置
Laravel推荐通过配置文件读取邮件发件人信息,而非直接调用env():
// 原代码 $message->from(env("MAIL_FROM_ADDRESS"), 'Some name'); // 修改为 $message->from(config('mail.from.address'), config('mail.from.name'));
确保config/mail.php中已正确配置:
'from' => [ 'address' => env('MAIL_FROM_ADDRESS', 'your-email@example.com'), 'name' => env('MAIL_FROM_NAME', 'Your Name'), ],
2. 清除Laravel配置缓存
如果服务器开启了配置缓存,执行以下命令清除缓存:
php artisan config:clear php artisan config:cache # 重新生成缓存(生产环境建议开启)
3. 临时硬编码发件人地址测试
若不确定是配置问题,可临时硬编码发件人地址验证:
$message->from('your-valid-email@example.com', 'Some name');
若此操作后不再报错,即可确认是配置读取的问题。
4. 防止表单重复提交
按钮多次点击可能导致请求异常,给表单添加防重复提交处理:
- 确保表单中包含Laravel的CSRF令牌(默认已存在可忽略):
<input type="hidden" name="_token" value="{{ csrf_token() }}">
- 按钮点击后禁用:
document.querySelector('form button').addEventListener('click', function(e) { this.disabled = true; this.form.submit(); });
调试建议
在Mail::send()前添加调试代码,确认发件人地址是否为空:
dd(env("MAIL_FROM_ADDRESS"), config('mail.from.address'));
若输出中env()返回空、config()有值,即可确定是缓存导致的问题。
内容的提问来源于stack exchange,提问作者Olaf Berserker
相关产品推荐
相关产品推荐

