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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 04:15:05