CLI下msmtp发信正常,PHP脚本调用mail函数发信异常求助
我来帮你一步步拆解这个问题——命令行能正常发信但PHP调用不行,还偶尔出现unknown-sender,大概率是权限、配置细节或者代码格式的小问题,咱们逐个排查:
1. 补全PHP的sendmail_path配置
你当前设置的sendmail_path = /usr/bin/msmtp -t可能存在环境变量差异:命令行下能找到默认的/etc/msmtprc,但Apache运行的www-data用户可能读不到这个配置。建议修改为明确指定配置文件路径:
sendmail_path = /usr/bin/msmtp -t -C /etc/msmtprc
修改后记得重启Apache生效:
sudo systemctl restart apache2
2. 修复PHP邮件头的转义错误
你代码里的邮件头用了单引号:
$header = 'From: autak987@gmail.com\r\n';
PHP里单引号不会解析\r\n,会把它当成普通字符串直接发送,导致邮件头格式混乱。改成双引号才能正确解析换行符:
$header = "From: autak987@gmail.com\r\n";
(不过你已经配置了msmtp默认发件人,其实可以省略这个header,但如果要加就必须保证格式正确)
3. 收紧msmtp相关文件的权限
你当前/etc/msmtprc的权限是rw-rw-r--,这个权限太松了——msmtp会拒绝读取包含密码的、权限开放的配置文件。建议把权限改成只有所有者可读可写:
sudo chmod 600 /etc/msmtprc
同时还要确保日志文件的权限正确,避免www-data用户无法写入日志:
sudo chown www-data:www-data /var/log/msmtp.log sudo chmod 600 /var/log/msmtp.log
4. 查看msmtp日志找具体错误
执行PHP发信脚本后,立刻查看msmtp的日志文件,这是最直接的排障依据:
cat /var/log/msmtp.log
日志里会明确告诉你问题所在——比如权限不足、Gmail认证失败、邮件格式错误等。如果出现authentication failed,大概率是你用了普通密码而非Google应用专用密码(尤其是开启了两步验证的账户,必须用应用专用密码登录SMTP)。
5. 模拟www-data用户测试msmtp
直接用www-data身份执行msmtp命令,模拟PHP的运行环境,验证是否是权限问题:
sudo -u www-data bash -c 'echo -e "Subject: Test PHP\r\n\r\nTest from www-data" | /usr/bin/msmtp -t -C /etc/msmtprc skrifix@seznam.cz'
如果这个命令失败,说明问题出在www-data用户的权限或msmtp配置;如果成功,那问题就集中在PHP的代码或配置上。
关于「unknown-sender」的问题
这个现象说明邮件发件人信息没有正确传递给msmtp:要么是PHP的邮件头格式错误(比如之前的单引号问题),要么是msmtp没有读取到默认账户的from配置。当msmtp找不到有效发件人时,就会用unknown-sender填充。
按照上面的步骤排查,优先看日志,应该能快速定位并解决问题。
内容的提问来源于stack exchange,提问作者milanHrabos

