cPanel服务器使用PHPMailer发信可送达Gmail但无法送达自定义域名邮箱
问题根因
你的代码存在核心逻辑错误,线上环境并未使用你配置的cPanel SMTP服务发送邮件,具体问题如下:
- 代码中判断非localhost环境时调用
$mail->isMail(),该方法会调用PHP内置的mail()函数,依赖服务器本地的邮件传输代理发送,你后续填写的Host/SMTPAuth/SMTP用户名密码/加密方式/端口等SMTP配置全部不会生效 - 本地MTA发送邮件时,发件人可能被服务器自动修改,不符合你域名的SPF、DKIM验证规则,Gmail对中小域名邮件的验证阈值较低可以正常放行,其他自定义域名邮局验证严格,会直接拒收或放入垃圾邮件文件夹,因此PHPMailer返回发送成功,但收件方实际收不到。
修复方案
1. 修正发送逻辑
删除原有本地/线上的发送方式判断,所有环境统一走你配置的cPanel SMTP服务,同时修正加密方式与端口的匹配关系:端口465对应隐式TLS加密(ENCRYPTION_SMTPS),端口587才对应ENCRYPTION_STARTTLS。
修正后的核心代码如下:
<?php require_once dirname(__DIR__, 2) . '/config/config.php'; require_once dirname(__DIR__, 2) . '/vendor/phpmailer/phpmailer/src/Exception.php'; require_once dirname(__DIR__, 2) . '/vendor/phpmailer/phpmailer/src/PHPMailer.php'; require_once dirname(__DIR__, 2) . '/vendor/phpmailer/phpmailer/src/SMTP.php'; use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; class Mailing { // Send Mail PHPMailer public function sendMail($to, $replyTo, $subject, $body, $output = null, $filename = null) { require_once dirname(__DIR__, 2) . '/vendor/autoload.php'; $mail = new PHPMailer(true); try { // 删掉原有判断,所有环境统一走SMTP $mail->isSMTP(); $mail->Host = SMTP_HOST; // cpanel mail smtp host $mail->SMTPAuth = true; $mail->Username = SMTP_USER; // cpanel smtp user,需要和发件人邮箱完全一致 $mail->Password = SMTP_PASS; // cpanel smtp password // 如果你用的端口是465,加密方式改为ENCRYPTION_SMTPS $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; $mail->Port = SMTP_PORT; // 465 $mail->setFrom(SMTP_USER, APP_NAME); $mail->addAddress($to); $mail->addReplyTo($replyTo); if ($output != null) { $mail->AddStringAttachment($output, $filename, 'base64', 'application/pdf'); } $mail->isHTML(true); $mail->Subject = $subject; $mail->Body = $body; $result = $mail->send(); if ($result) { return true; } else { return $mail->ErrorInfo; } } catch (Exception $e) { return $e->getMessage(); } } }
2. 后续排查步骤
如果修复后仍有问题,可按以下顺序排查:
- 检查收件方的垃圾邮件、广告邮件文件夹,确认是否被标记为垃圾邮件
- 确认你的发件域名已经正确配置SPF、DKIM、DMARC解析记录,cPanel后台可直接获取对应记录值,添加到你的域名解析商处即可
- 查看cPanel的邮件发送日志,或联系主机商获取退信原因,确认远端邮局拒收的具体理由
- 调试时可开启SMTP调试模式:添加
$mail->SMTPDebug = 2;,即可输出完整的SMTP交互日志定位问题
内容的提问来源于stack exchange,提问作者DCodeMania
相关产品推荐
相关产品推荐

