成长值: 345 签到天数: 4740 天 [LV.Master]伴坛终老
|
发表于 2024/12/25 20:35
|
显示全部楼层
|阅读模式
|Google Chrome 131.0.0.0 |Windows 10
Linux centos更新php7.2版本后,由于是用高版本openssl编译可能导致无法发送邮件,php.ini证书验证ca可信解决问题
报错内容
The following From address failed: xxx@qq.com : Called Mail() without being connected
测试代码
- <?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连接
至于产生的原因,猜测是动态链接库编译openssl引起的,有时间试试静态编译 |
|