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

CentOS 8下PHP mail()调用Sendmail无法发送邮件求助

PHP mail()返回true但邮件未实际发送的问题排查

环境信息

  • 系统:CentOS 8
  • 已安装并运行Postfix和Sendmail
  • SSH直接调用Sendmail测试无报错,但收件方未收到邮件(含垃圾邮件文件夹)
  • php.ini中SMTP配置为mail.levaweb.com
  • 已安装AApanel,通过面板可正常发送邮件

已参考资料

  • 《Troubleshooting PHP Mail》
  • 《Sendmail in PHP Complete Guide》

SSH测试命令

echo "Subject: sendmail test" | sendmail -v myemail@gmail.com

测试输出

220 server1.levaweb.com ESMTP Postfix
>>> EHLO server1.levaweb.com
250-server1.levaweb.com
250-PIPELINING
250-SIZE 102400000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-DSN
250-SMTPUTF8
250 CHUNKING
>>> STARTTLS
220 2.0.0 Ready to start TLS
>>> EHLO server1.levaweb.com
250-server1.levaweb.com
250-PIPELINING
250-SIZE 102400000
250-VRFY
250-ETRN
250-AUTH PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-DSN
250-SMTPUTF8
250 CHUNKING
>>> MAIL From:<root@server1.levaweb.com> SIZE=23 AUTH=root@server1.levaweb.com
250 2.1.0 Ok
>>> RCPT To:<myemail@gmail.com>
>>> DATA
250 2.1.5 Ok
354 End data with <CR><LF>.<CR><LF>
>>> .
250 2.0.0 Ok: queued as 4CB6C40096
myemail@gmail.com... Sent (Ok: queued as 4CB6C40096)
Closing connection to [127.0.0.1]
>>> QUIT
221 2.0.0 Bye

排查与解决步骤

1. 确认PHP mail()的Sendmail路径配置

PHP的SMTP参数仅适用于Windows环境,Linux下mail()依赖sendmail_path配置。执行命令查看当前配置:

php -i | grep sendmail_path

确保路径指向系统实际的Sendmail或Postfix兼容二进制(通常为/usr/sbin/sendmail)。可对比AApanel中PHP的sendmail_path配置,若面板配置不同,同步修改即可。

2. 检查Postfix投递日志

查看CentOS 8的Postfix日志(路径/var/log/maillog),过滤PHP相关投递记录:

grep -i "php" /var/log/maillog
# 或按测试时的队列ID查找
grep "4CB6C40096" /var/log/maillog

日志会显示邮件是否被收件方服务器拒收、SPF/DKIM验证失败等具体原因。

3. 完善PHP邮件头部信息

原生mail()若缺少必要头部,极易被拦截。使用带完整头部的测试代码:

$to = 'myemail@gmail.com';
$subject = 'PHP Mail Test';
$message = 'This is a test email from PHP.';
$headers = [
    'From' => 'noreply@levaweb.com',
    'Reply-To' => 'noreply@levaweb.com',
    'X-Mailer' => 'PHP/' . phpversion()
];

$status = mail($to, $subject, $message, $headers);
var_dump($status);

确保From地址域名与服务器域名一致,避免使用root@server1.levaweb.com这类系统账号发信。

4. 验证SPF/DKIM DNS记录

  • SPF记录:检查levaweb.com的TXT记录是否包含服务器IP,格式类似v=spf1 ip4:xxx.xxx.xxx.xxx ~all
  • DKIM记录:确认域名存在default._domainkey.levaweb.com的TXT记录,且与Postfix中配置的DKIM公钥匹配

5. 切换到AApanel的SMTP服务

既然AApanel可正常发信,直接用SMTP替代原生mail()更可靠,示例代码(使用PHPMailer):

require 'PHPMailer/PHPMailer.php';
require 'PHPMailer/SMTP.php';

$mail = new PHPMailer\PHPMailer\PHPMailer();
$mail->isSMTP();
$mail->Host = 'mail.levaweb.com';
$mail->SMTPAuth = true;
$mail->Username = 'your-account@levaweb.com';
$mail->Password = 'your-password';
$mail->SMTPSecure = 'tls';
$mail->Port = 587;

$mail->setFrom('noreply@levaweb.com', 'LevaWeb');
$mail->addAddress('myemail@gmail.com');
$mail->Subject = 'PHP SMTP Test';
$mail->Body = 'This email is sent via AApanel SMTP.';

if (!$mail->send()) {
    echo 'Error: ' . $mail->ErrorInfo;
} else {
    echo 'Message sent successfully';
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 00:24:25