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

Laravel5.4升级至9后发邮件报sendmail连接意外关闭如何解决

故障原因
  • 底层邮件依赖逻辑变更:Laravel 9 替换了旧版的SwiftMailer组件,改用Symfony Mailer作为邮件发送底层。两个组件调用sendmail的逻辑存在本质差异:旧版SwiftMailer默认通过-t参数直接向sendmail进程传递邮件内容完成发送,不需要SMTP会话交互;新版Symfony Mailer默认通过-bs参数启动sendmail进程后,会按照标准SMTP协议和进程做会话交互,若服务器上的sendmail(多数场景是postfix的软链接)未开放本地SMTP交互模式,进程启动后会直接退出,触发连接意外关闭的报错。
  • 配置文件不兼容:从5.4版本跨大版本升级到9时,若未同步更新config/mail.php配置文件,旧版配置中缺失新版要求的mailers配置段、sendmail路径配置错误、参数不全,都会导致调用异常。常见问题是配置里写死的/usr/bin/sendmail路径和服务器实际sendmail路径不匹配,多数Linux发行版的sendmail实际安装路径为/usr/sbin/sendmail。
  • 权限校验不通过:新版Symfony Mailer对进程启动权限的校验更严格,若PHP运行用户(php-fpm、CLI对应的执行用户,如www-data、nginx)没有sendmail二进制文件的执行权限,进程启动后会被系统立刻终止,抛出同类错误。
排查修复步骤
  • 第一步:修正邮件配置
    打开项目config/mail.php文件,先确认配置结构符合Laravel 9的规范:如果是跨大版本升级上来的项目,建议先备份原有配置,执行php artisan vendor:publish --tag=laravel-mail重新发布官方最新的mail配置文件,再做自定义调整。
    找到sendmail对应的配置段,将路径替换为服务器实际的sendmail路径,补充必要参数,参考配置如下:
    'mailers' => [
        // 其他邮件驱动配置...
        'sendmail' => [
            'transport' => 'sendmail',
            // 先在服务器执行which sendmail获取真实路径替换,-i参数用于避免内容中的单行点号被误判为邮件结束符
            'path' => '/usr/sbin/sendmail -bs -i',
        ],
    ],
    

    注意不要遗漏配置项里的transport字段,旧版配置文件没有这个字段,会导致框架无法识别驱动类型。

  • 第二步:验证sendmail服务可用性
    登录服务器切换到PHP实际运行用户,手动执行配置中填写的sendmail启动命令,比如/usr/sbin/sendmail -bs -i,进入交互模式后输入EHLO test:
    • 如果执行命令后直接退出、返回命令不存在、权限不足的提示,先对应修复:命令不存在则安装postfix/sendmail服务;权限不足则给PHP运行用户分配sendmail的执行权限,同时检查postfix配置是否允许本地用户发信。
    • 如果输入EHLO test后返回250开头的SMTP响应码,说明sendmail本身的交互模式正常。
  • 第三步:清除配置缓存
    配置修改完成后,在项目根目录执行以下命令清除缓存,避免旧配置持续生效:
    php artisan config:clear
    php artisan cache:clear
    
  • 第四步:功能验证
    编写临时测试脚本,直接调用Mail门面发送测试邮件,排除业务逻辑的干扰,确认发送是否正常。如果sendmail模式始终无法调通,可以临时切换为smtp驱动,配置可用的SMTP服务参数验证邮件组件本身是否正常,缩小排查范围。

内容的提问来源于stack exchange,提问作者Anand Jangjude

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 08:21:31