通过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证书
解决建议
指定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证书完整。
更换OVH SMTP服务器地址
OVH提供多个SMTP节点,尝试用smtp.mail.ovh.net替代ssl0.ovh.net,同时对应调整端口和加密方式:- 使用587端口时,设置
$mail->SMTPSecure = 'tls'; - 使用465端口时,保持
$mail->SMTPSecure = 'ssl';
- 使用587端口时,设置
更新服务器CA证书
服务器缺少根CA证书会导致SSL握手失败,执行对应命令更新证书:- Debian/Ubuntu系统:
sudo apt-get update && sudo apt-get install ca-certificates - CentOS/RHEL系统:
sudo yum update ca-certificates
- Debian/Ubuntu系统:
延长连接超时时间
网络波动可能导致超时,尝试延长超时时间:$mail->Timeout = 60; // 从默认30秒改为60秒排查服务器网络限制
检查OVH服务器是否有出站端口限制,测试服务器到ssl0.ovh.net的连通性:telnet ssl0.ovh.net 465或
openssl s_client -connect ssl0.ovh.net:465观察连接是否稳定,是否存在握手失败情况。
内容的提问来源于stack exchange,提问作者carlos519
相关产品推荐
相关产品推荐

