成长值: 201
 签到天数: 5053 天 [LV.Master]伴坛终老  
 | 
 
 
发表于 2024/12/25 20:35
|
显示全部楼层
|阅读模式
| Google Chrome 131.0.0.0 | Windows 10  
 
 
 
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引起的,有时间试试静态编译 
 
 |   
 
 
 
 |