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

通过OVH SMTP用PHPMailer发邮件随机出现SSL加密错误求助

问题描述

我在OVH平台部署了一个使用PHPMailer通过OVH邮箱SMTP发送邮件的脚本,该脚本约60%概率返回Error #2: stream_socket_client(): Failed to enable crypto错误,剩余40%能正常发送。本地(localhost)运行时脚本100%正常。

我已经在OVH的DNS记录中配置了DKIM和SPF(经mail-tester.com验证有效),尝试过tls/starttls搭配587端口,问题依然存在。联系OVH后对方表示其侧无异常,我怀疑是OVH SMTP服务器连接问题,但无法定位解决方法,恳请协助。

完整错误信息

Connection: opening to ssl://ssl0.ovh.net:465, timeout=300, options=array()
Connection failed. Error #2: stream_socket_client(): SSL: Success [/XXX/PHPMailer-master/src/SMTP.php line 408]
Connection failed. Error #2: stream_socket_client(): Failed to enable crypto [/XXX/PHPMailer-master/src/SMTP.php line 408]
Connection failed. Error #2: stream_socket_client(): Unable to connect to ssl://ssl0.ovh.net:465 (Unknown error) [/XXX/PHPMailer-master/src/SMTP.php line 408]
SMTP ERROR: Failed to connect to server: (0)
SMTP Error: Could not connect to SMTP host. Failed to connect to server

脚本内容

<?php
ini_set('display_errors', 1); 
error_reporting(E_ALL);
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'PHPMailer-master/src/Exception.php';
require 'PHPMailer-master/src/PHPMailer.php';
require 'PHPMailer-master/src/SMTP.php';
$mail = new PHPMailer(true);          
$email = "XXX@gmail.com";
$to = $email;
$subject = "Test";
$message = "
                <html>
                <body>
                    <h1>test email !</h1>
                </body>
                </html>
 ";

$mail->Host = 'ssl0.ovh.net'; 
$mail->SMTPAuth = true;
$mail->SMTPSecure = 'ssl';
$mail->Port = 465; 
$mail->Username = 'hidden for stackoverflow'; 
$mail->Password = 'hidden for stackoverflow'; 
$mail->isSMTP();
$mail->CharSet = 'UTF-8';
$mail->addCustomHeader('MIME-Version: 1.0');
$mail->addCustomHeader('Content-type:text/html;charset=UTF-8');
$mail->isHTML(true);     
$mail->setFrom('hidden for stackoverflow', 'hidden for stackoverflow');
$mail->addReplyTo('hidden for stackoverflow', 'hidden for stackoverflow');
$mail->addAddress($to);             
$mail->Subject = $subject;
$mail->Body    = $message;
$mail->SMTPDebug = 4; 
    

if (!$mail->send()) {
    echo 'Email not sent an error was encountered: ' . $mail->ErrorInfo;
} else {
    echo 'Message has been sent.';
}

已尝试操作

  • 联系OVH客服
  • 配置DKIM和SPF记录
  • 本地运行脚本测试
  • 尝试tls/starttls搭配587端口
  • 重置SSL证书

解决建议
  1. 指定SSL协议版本
    部分服务器对SSL/TLS协议版本兼容性有要求,尝试在脚本中强制指定协议版本,添加以下代码:

    $mail->SMTPOptions = array(
        'ssl' => array(
            'verify_peer' => false,
            'verify_peer_name' => false,
            'allow_self_signed' => true,
            'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT
        )
    );
    

    注意:关闭证书验证是临时排查手段,问题解决后建议开启验证并确保服务器CA证书完整。

  2. 更换OVH SMTP服务器地址
    OVH提供多个SMTP节点,尝试用smtp.mail.ovh.net替代ssl0.ovh.net,同时对应调整端口和加密方式:

    • 使用587端口时,设置$mail->SMTPSecure = 'tls';
    • 使用465端口时,保持$mail->SMTPSecure = 'ssl';
  3. 更新服务器CA证书
    服务器缺少根CA证书会导致SSL握手失败,执行对应命令更新证书:

    • Debian/Ubuntu系统:
      sudo apt-get update && sudo apt-get install ca-certificates
      
    • CentOS/RHEL系统:
      sudo yum update ca-certificates
      
  4. 延长连接超时时间
    网络波动可能导致超时,尝试延长超时时间:

    $mail->Timeout = 60; // 从默认30秒改为60秒
    
  5. 排查服务器网络限制
    检查OVH服务器是否有出站端口限制,测试服务器到ssl0.ovh.net的连通性:

    telnet ssl0.ovh.net 465
    

    或

    openssl s_client -connect ssl0.ovh.net:465
    

    观察连接是否稳定,是否存在握手失败情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 14:05:31