小樱 发表于 2024/12/25 20:35

Linux centos更新php7.2版本后,由于是用高版本openssl编译可能导致无法发送smtp邮件,php.ini证书验证ca可信解决问题

Linux centos更新php7.2版本后,由于是用高版本openssl编译可能导致无法发送smtp邮件,php.ini证书验证ca可信解决问题

报错内容
The following From address failed: xxx@qq.com : Called Mail() without being connected

测试代码,这段代码要求php5.4及以上版本
<?php
// 打印当前 PHP 版本
echo '当前 PHP 版本: ' . phpversion() . "\n";

// 验证与 SSL SMTP 服务器的连接
$host = 'smtphz.qiye.163.com';
$port = 994;

// 创建一个忽略证书验证的上下文
$context = stream_context_create([
    'ssl' => [
      'verify_peer' => true, // true启用证书验证,改成false关闭
      'verify_peer_name' => true, // true启用证书域名验证是否相同,改成false关闭
    ],
]);

// 使用 fsockopen 尝试连接
$connection = @stream_socket_client('ssl://' . $host . ':' . $port, $errno, $errstr, 10, STREAM_CLIENT_CONNECT, $context);

if ($connection) {
    echo "成功连接到 $host:$port\n";
    fclose($connection); // 关闭连接
} else {
    echo "无法连接到 $host:$port. 错误: $errstr ($errno)\n";
}
?>

降级旧版php后发信正常

解决办法,用小于1.1.1的系统自带旧版本openssl重新编译php
或者修改网站代码,在发送邮件的代码增加忽略证书验证,要同时增加忽略域名验证是否相同
'verify_peer' => false,
'verify_peer_name' => false,

修改发信代码后,此时新版本openssl编译的php可正常连接


参考:https://www.php.net/manual/zh/context.ssl.php

还有一种解决办法,修改php-templete.ini文件
打开网站下载cacert.pem
https://curl.se/docs/caextract.html
https://curl.se/ca/cacert.pem

把下载文件的上传到服务器/vhs/kangle/ext/tpl_php7234/cacert.pem
编辑php-templete.ini,去掉openssl.cafile前面的分号,并且修改内容如下
openssl.cafile=/vhs/kangle/ext/tpl_php7234/cacert.pem

重启kangle,在次运行测试代码,此时可以恢复ssl连接

一般来说php8.1开始会遇到这个问题,因为需要高版本openssl,至于产生的原因,猜测是动态链接库编译openssl引起的,有时间试试静态编译

页: [1]
查看完整版本: Linux centos更新php7.2版本后,由于是用高版本openssl编译可能导致无法发送smtp邮件,php.ini证书验证ca可信解决问题