Exim邮件服务器本地发件异常:预期响应码250却收到550错误
解决Exim + Laravel Swift Mailer本地发送邮件报550错误的问题
这个550 127.0.0.1 is _my_ address错误本质是Exim把来自本地127.0.0.1的未认证连接当成了可疑请求——虽然是服务器内部发起的,但你的Laravel没走认证,而Exim默认规则会阻止这种"自己给自己发"的无认证请求(防止邮件循环或垃圾邮件)。外部连接能正常发送,是因为你做了认证,Exim信任认证后的请求。
下面给你两种解决思路,选适合你的就行:
方案一:让Laravel本地发送时也走认证(推荐)
这种方式最稳妥,不用修改Exim核心规则,只需要调整Laravel的配置:
- 打开项目根目录的
.env文件,确保邮件配置里加上认证信息(和你外部发送用的账号密码一致):MAIL_MAILER=smtp MAIL_HOST=localhost MAIL_PORT=587 # 优先用587端口(Exim的submission端口,专门给客户端认证用),25端口支持认证也可以用 MAIL_USERNAME=你的Exim认证用户名 MAIL_PASSWORD=你的Exim认证密码 MAIL_ENCRYPTION=tls # 根据Exim配置来,也可设为null MAIL_FROM_ADDRESS=your@domain.com MAIL_FROM_NAME="${APP_NAME}" - 保存后清空Laravel缓存:
php artisan config:clear - 测试发送:执行
php artisan mail:send "Test Local Mail" --to=your-test-email@xxx.com验证是否正常。
方案二:修改Exim配置,允许本地无认证发送
如果你不想用认证,可以调整Exim的ACL规则,让它信任来自127.0.0.1的连接:
- 找到Exim的主配置文件,通常是
/etc/exim.conf或/etc/exim4/exim4.conf(不同发行版路径可能不同) - 找到
acl_check_rcpt这个ACL段,在合适位置添加规则,允许本地IP跳过认证:
或者如果你的Exim配置里有acl_check_rcpt: # 保留原有规则,新增下面这行 accept hosts = 127.0.0.1 : ::1 control = submission/sender_retain # 原有其他规则...acl_smtp_auth段,也可以在这里添加:acl_smtp_auth: accept hosts = 127.0.0.1 : ::1 # 原有认证规则... - 保存配置后重启Exim服务:
systemctl restart exim(Debian/Ubuntu系统用systemctl restart exim4) - 测试本地发送,确认错误消失。
额外排查点
- 检查Exim的
local_interfaces配置,确保它监听了127.0.0.1:
在配置文件里找local_interfaces,应该包含127.0.0.1和::1,示例:local_interfaces = 0.0.0.0 : ::1 : 127.0.0.1 - 查看Exim详细日志(比如
/var/log/exim/mainlog),如果问题依旧,日志会显示是哪条ACL规则触发了拒绝,可针对性调整。
内容的提问来源于stack exchange,提问作者Astroguy Pasa
相关产品推荐
相关产品推荐

