You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的连接:

  1. 找到Exim的主配置文件,通常是/etc/exim.conf或/etc/exim4/exim4.conf(不同发行版路径可能不同)
  2. 找到acl_check_rcpt这个ACL段,在合适位置添加规则,允许本地IP跳过认证:
    acl_check_rcpt:
      # 保留原有规则,新增下面这行
      accept  hosts = 127.0.0.1 : ::1
              control = submission/sender_retain
      # 原有其他规则...
    
    或者如果你的Exim配置里有acl_smtp_auth段,也可以在这里添加:
    acl_smtp_auth:
      accept  hosts = 127.0.0.1 : ::1
      # 原有认证规则...
    
  3. 保存配置后重启Exim服务:systemctl restart exim(Debian/Ubuntu系统用systemctl restart exim4)
  4. 测试本地发送,确认错误消失。

额外排查点

  • 检查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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:13:54