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

PHP代码中Postfix使用问题:网站邮件显示发送成功但未收到求助

这种情况我之前在维护PHP站点时也碰到过——命令行能正常发邮件,但PHP触发后显示成功却收不到,大概率是PHP配置、权限或者代码细节的问题,咱们一步步来排查:

1. 先检查PHP的核心邮件配置(php.ini)

  • 首先用命令找到你的php.ini位置:php -i | grep php.ini
  • 重点看sendmail_path配置项,必须指向系统Postfix兼容的发送路径,比如:
    sendmail_path = /usr/sbin/sendmail -t -i
    如果习惯用mail命令,也可以尝试配置为:sendmail_path = /usr/bin/mail -t -i
  • 修改后一定要重启PHP-FPM或你的Web服务器(Apache/Nginx),否则配置不会生效

2. 别只信前端提示,去日志里找真相

  • PHP的mail()函数返回true,只代表它把邮件提交给了邮件服务器(MTA),不代表邮件真的发出去了
  • 查PHP错误日志:通常在/var/log/php-fpm/或/var/log/apache2/目录下,找和邮件发送相关的警告/错误
  • 查Postfix日志:/var/log/mail.log,看看PHP提交的邮件有没有被Postfix接收,有没有被拒绝、进入队列或者被标记为垃圾

3. 验证Web服务器用户的发件权限

  • 命令行是用你的个人用户执行mail命令,但PHP是用Web服务器的用户(比如www-data、apache)运行的
  • 切换到Web用户测试发件:sudo -u www-data mail -s "PHP User Test" recipient@domain.com,输入内容后按Ctrl+D发送
  • 如果这一步发不出邮件,说明Web用户没有发件权限,或者没有配置合法的发件人身份

4. 检查PHP代码里的发件人头部

  • 很多邮件服务器会拒绝**没有明确发件人(From)**的邮件,或者发件人地址不符合域名规范
  • 确保代码里设置了合法的From头,比如:
$to = 'recipient@domain.com';
$subject = 'Test from PHP';
$message = 'Hello from PHP site';
$headers = 'From: noreply@yourdomain.com' . "\r\n" .
           'Reply-To: noreply@yourdomain.com' . "\r\n" .
           'X-Mailer: PHP/' . phpversion();

if(mail($to, $subject, $message, $headers)) {
    echo 'Message Sent';
} else {
    echo 'Failed to send';
}
  • 建议发件人地址是Zimbra中已存在的邮箱(比如专门创建的noreply@yourdomain.com),避免被拦截

5. 捕获PHP发件的具体错误

  • 可以在代码里添加错误捕获,查看mail()函数失败时的详细信息:
$sent = mail($to, $subject, $message, $headers);
if(!$sent) {
    $error = error_get_last();
    var_dump($error);
}
  • 这能帮你定位到具体问题,比如找不到sendmail命令、权限不足,或者邮件格式错误

6. 最后检查Zimbra的收件端

  • 有时候邮件已经成功发送,但被Zimbra当成垃圾邮件拦截,或者被收件人的规则移到了其他文件夹
  • 登录Zimbra Web界面,检查垃圾邮件文件夹,或者查看Zimbra的邮件接收日志

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:58:43