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
相关产品推荐
相关产品推荐

