如何解决PHPMailer连接SMTP时的证书CN不匹配错误?
我正尝试在GoDaddy VPS上使用PHPMailer类发送邮件,但遇到如下错误:
注:VPS与SMTP邮件服务来自不同服务商,类似通过Gmail发邮件的场景,但我用的是其他SMTP服务商。
若注释掉$mail->isSMTP()代码行,邮件能通过服务器的sendmail程序发送,但这不是我想要的SMTP方式。
SMTP响应错误信息
2023-03-31 02:18:42 SERVER -> CLIENT: 220 TLS go ahead SMTP Error: Could not connect to SMTP host. Connection failed. stream_socket_enable_crypto(): Peer certificate CN=`ns1.tbrjar.com' did not match expected CN=`smtp.tbrjar.com'
我的代码
use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require 'src/Exception.php'; require 'src/PHPMailer.php'; require 'src/SMTP.php'; $mail = new PHPMailer; $mail->isSMTP(); $mail->SMTPDebug = 2; // 0 = 关闭(生产环境用)- 1 = 客户端消息 - 2 = 客户端和服务器消息 $mail->Host = "smtp.tbrjar.com"; // 若网络不支持IPv6,可使用$mail->Host = gethostbyname('smtp.gmail.com'); $mail->Port = 587; // 仅TLS $mail->SMTPSecure = 'tls'; // ssl已废弃 $mail->SMTPAuth = true; $mail->Username = $smtpUser; $mail->Password = $smtpPass; $mail->setFrom($emailFrom, $emailFromName); $mail->addAddress($emailTo, $emailToName); $mail->Subject = 'PHPMailer GMail SMTP test'; $mail->msgHTML("test body"); // 可替换为$mail->msgHTML(file_get_contents('contents.html'), __DIR__); 从外部文件读取HTML邮件内容,转换引用图片为嵌入式 $mail->AltBody = 'HTML messaging not supported'; // $mail->addAttachment('images/phpmailer_mini.png'); // 附加图片文件 if(!$mail->send()){ echo "Mailer Error: " . $mail->ErrorInfo; }else{ echo "Message sent!"; }
这个错误核心是SMTP服务器返回的SSL证书域名和你指定的Host域名不匹配——你连接的是smtp.tbrjar.com,但证书绑定的域名是ns1.tbrjar.com,导致TLS握手失败。可按以下步骤处理:
核对SMTP服务器地址
先确认SMTP服务商提供的服务器地址是否正确,有可能是服务商配置错误或你记错了地址。可以在VPS上执行nslookup smtp.tbrjar.com查看解析IP,对比ns1.tbrjar.com的IP,如果两者一致,说明服务商把SMTP服务挂在了NS域名上,直接把代码里的$mail->Host改成ns1.tbrjar.com即可。临时关闭证书验证(仅测试用)
如果只是临时测试,或服务商暂时无法修正证书问题,可在代码中添加以下行关闭证书验证:$mail->SMTPOptions = array( 'ssl' => array( 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true ) );注意:生产环境禁用此操作,会带来安全风险。
联系SMTP服务商修正配置
最根本的解决办法是联系你的SMTP服务商,告知他们证书域名与SMTP服务域名不匹配的问题,让他们调整SSL证书绑定域名或修正SMTP解析配置。检查GoDaddy VPS网络限制
部分VPS服务商可能限制出站SMTP流量(尤其是587、465端口),可在VPS上执行telnet smtp.tbrjar.com 587测试连通性,若无法连接,需联系GoDaddy解除限制。
内容的提问来源于stack exchange,提问作者John

