PHPMailer在CLI环境可用但CGI环境不可用的原因排查
看起来你遇到的是典型的CLI与Apache运行环境差异导致的邮件发送失败问题,既然你已经看过官方排查指南,我直接给你几个针对性的排查和修复方向:
检查Apache用户(www-data)的权限
CLI模式下是用你当前登录用户执行脚本,而Apache是用www-data用户运行的。你需要确保:/usr/sbin/ssmtp和/usr/sbin/sendmail(如果是软链到ssmtp的话)的执行权限包含www-data,可以用命令检查:ls -l /usr/sbin/ssmtp,确保权限是-rwxr-xr-x之类的(其他用户有执行权限)。/etc/ssmtp/ssmtp.conf的读取权限要开放给www-data,执行ls -l /etc/ssmtp/ssmtp.conf,权限至少是-rw-r--r--。
指定sendmail绝对路径,避开环境变量差异
CLI和Apache的PATH环境变量可能不一样,导致PHP找不到ssmtp的位置。你可以直接在PHPMailer代码里指定sendmail的路径,不用依赖系统环境:$mail->isSendmail(); $mail->Sendmail = '/usr/sbin/ssmtp'; // 替换成你的ssmtp实际路径查看ssmtp的详细日志
在/etc/ssmtp/ssmtp.conf里添加Debug=YES,然后查看系统邮件日志/var/log/mail.log,找Apache运行时的相关错误记录——比如是不是www-data用户无法读取某个配置文件,或者连接Gmail时的权限问题(虽然CLI正常,但环境差异可能导致认证上下文不同)。检查AppArmor限制
Ubuntu 16.04默认启用AppArmor,可能会阻止Apache进程调用ssmtp。你可以临时关闭AppArmor测试:sudo systemctl stop apparmor如果关闭后能正常发送邮件,就需要修改AppArmor规则,给Apache允许执行ssmtp的权限,具体可以编辑
/etc/apparmor.d/usr.sbin.ssmtp,添加类似/usr/sbin/ssmtp px,的规则(记得重启AppArmor生效)。对比CLI与Apache的PHP配置
CLI和Apache使用的是不同的php.ini文件,你需要确保Apache的php.ini里sendmail_path配置正确:- Apache的php.ini路径一般是
/etc/php/7.0/apache2/php.ini - 找到
sendmail_path项,设置为sendmail_path = /usr/sbin/ssmtp -t,保存后重启Apache:sudo systemctl restart apache2
- Apache的php.ini路径一般是
这些方向应该能覆盖你遇到的问题,毕竟CLI正常说明ssmtp和Gmail的配置本身是没问题的,核心就是Apache运行环境的权限或配置差异。
内容的提问来源于stack exchange,提问作者Frank

