12下一页
返回列表 发帖
查看: 2587|回复: 14

[已解决] 还是 discuz 3.4 邮件设置问题

17

主题

115

回帖

243

积分

炉火纯青

贡献
0 点
金币
97 个
发表于 2022-8-9 07:09:59 | 显示全部楼层 |阅读模式
1、如图所示,同样的php.ini配置,在 php 7.4 下 25 端口可以正常收发邮件, 465 端口就不行(日志错误是 CONNECT - Unable to connect to the SMTP server),而用 php 5.5, 25 和 465 端口都可以正常收发邮件。
邮局测试.jpg
2、网上的文章
2.jpg

希望高手能排查
1 贡献

最佳答案

新环境c7、php7.4、openssl1.1.1g,再discuz里发送邮件总是报ssl连接不上
Warning: fsockopen(): SSL operation failed with code 1. OpenSSL Error messages:
error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed in /www/a.php on line 5

Warning: fsockopen(): Failed to enable crypto in /www/a.php on line 5

Warning: fsockopen(): unable to connect to ssl://smtp.exmail.qq.com:465 (Unknown error) in /www/a.php on line 5
  

以上是测试结果

找了google和度娘都没有解决,说什么证书问题

最后看到个修改方法的,临时用一下

修改 source/function/function_core.php

注释原来的函数,新增以下方法

function fsocketopen($hostname, $port = 80, &$errno, &$errstr, $timeout = 15) {
    $fp = '';
    if(function_exists('stream_socket_client')) {
        $contextOptions = array(
                    'ssl' => array(
                        'verify_peer' => false,
                        'verify_peer_name' => false
                    )
                );
                $context = stream_context_create($contextOptions);
                $fp = @stream_socket_client($hostname.':'.$port, $errno, $errstr, $timeout,STREAM_CLIENT_CONNECT, $context);
        }
    return $fp;
}
测试后可以正常放邮件,就是以后dz升级要注意下这块或者重新编译系统环境。

原文提示

一个php系统很早的了,后来把环境升级换成https与php5.6以后发现通信api不工作,通过排查发现是fsockopen函数的问题:

报错:Warning:  fsockopen(): SSL operation failed with code 1. OpenSSL Error messages:error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate



解决方法法改造一下fsockopen方法:

//不验证证书

$contextOptions = array(

    'ssl' => array(

        'verify_peer' => false,

        'verify_peer_name' => false

    )

);

//如果有签名的证书

/*

$contextOptions = array(

    'ssl' => array(

        'verify_peer' => true,

        'cafile' => '/path/to/cacert.pem',

        //'CN_match' => 'xcwmoon.net', // 匹配域名

        'ciphers' => 'HIGH:!SSLv2:!SSLv3',

        'disable_compression' => true,

    )

);

*/

$context = stream_context_create($contextOptions);

$fp = stream_socket_client("ssl://{$host}:{$port}", $errno, $errstr, $timeout, STREAM_CLIENT_CO
回复

使用道具 举报

7

主题

1478

回帖

2562

积分

应用开发者

贡献
175 点
金币
123 个
QQ
发表于 2022-8-9 08:25:31 | 显示全部楼层
你是用的 宝塔面板吗?  可以重新 编译安装一下 php7 试试呢
专业解决各类服务器问题 和 discuz疑难杂症!
QQ 860855665 西部数码核心代理www.wensuhulian.com 飘仙建站论坛bbs.piaoxian.net
discuz互助QQ群 73131419
回复 支持 反对

使用道具 举报

17

主题

115

回帖

243

积分

炉火纯青

贡献
0 点
金币
97 个
 楼主| 发表于 2022-8-9 20:50:10 | 显示全部楼层
天外飘仙 发表于 2022-8-9 08:25
你是用的 宝塔面板吗?  可以重新 编译安装一下 php7 试试呢

不是宝塔,自己搭建的邮件服务器,server 2019,想升级成 php 7.4,现在就剩这一个 465 端口问题
回复 支持 反对

使用道具 举报

18

主题

1829

回帖

2754

积分

应用开发者

贡献
52 点
金币
574 个
QQ
发表于 2022-8-10 03:06:38 | 显示全部楼层
邮件服务器自行搭建的?用465 证书配置是公网的还是自签名的?
无限星辰工作室  好集导航 免费API
服务Discuz建站|定制|小程序|APP定制|故障维修|搬家|运维|挂马清理|防护|性能优化|安全运维|
服务理念:专业 诚信 友好QQ842062626 服务
回复 支持 反对

使用道具 举报

17

主题

115

回帖

243

积分

炉火纯青

贡献
0 点
金币
97 个
 楼主| 发表于 2022-8-10 06:42:28 | 显示全部楼层
crx349 发表于 2022-8-10 03:06
邮件服务器自行搭建的?用465 证书配置是公网的还是自签名的?

没有证书
回复 支持 反对

使用道具 举报

18

主题

1829

回帖

2754

积分

应用开发者

贡献
52 点
金币
574 个
QQ
发表于 2022-8-10 16:21:05 | 显示全部楼层

没配置 证书你截图上的ssl怎么来的?
无限星辰工作室  好集导航 免费API
服务Discuz建站|定制|小程序|APP定制|故障维修|搬家|运维|挂马清理|防护|性能优化|安全运维|
服务理念:专业 诚信 友好QQ842062626 服务
回复 支持 反对

使用道具 举报

17

主题

115

回帖

243

积分

炉火纯青

贡献
0 点
金币
97 个
 楼主| 发表于 2022-8-10 20:39:50 | 显示全部楼层
不需要证书,跑偏了,我在 php 5.5 邮件系统是正常使用的,php 7.4 不行
回复 支持 反对

使用道具 举报

17

主题

115

回帖

243

积分

炉火纯青

贡献
0 点
金币
97 个
 楼主| 发表于 2022-8-10 20:52:55 | 显示全部楼层
crx349 发表于 2022-8-10 16:21
没配置 证书你截图上的ssl怎么来的?

你这一说,我发现 5.5 之后版本的php.ini都多了下面一节,之前版本是没有的
[openssl]
; The location of a Certificate Authority (CA) file on the local filesystem
; to use when verifying the identity of SSL/TLS peers. Most users should
; not specify a value for this directive as PHP will attempt to use the
; OS-managed cert stores in its absence. If specified, this value may still
; be overridden on a per-stream basis via the "cafile" SSL stream context
; option.
;openssl.cafile=

; If openssl.cafile is not specified or if the CA file is not found, the
; directory pointed to by openssl.capath is searched for a suitable
; certificate. This value must be a correctly hashed certificate directory.
; Most users should not specify a value for this directive as PHP will
; attempt to use the OS-managed cert stores in its absence. If specified,
; this value may still be overridden on a per-stream basis via the "capath"
; SSL stream context option.
;openssl.capath=
回复 支持 反对

使用道具 举报

17

主题

115

回帖

243

积分

炉火纯青

贡献
0 点
金币
97 个
 楼主| 发表于 2022-8-10 22:32:58 | 显示全部楼层
新环境c7、php7.4、openssl1.1.1g,再discuz里发送邮件总是报ssl连接不上
Warning: fsockopen(): SSL operation failed with code 1. OpenSSL Error messages:
error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed in /www/a.php on line 5

Warning: fsockopen(): Failed to enable crypto in /www/a.php on line 5

Warning: fsockopen(): unable to connect to ssl://smtp.exmail.qq.com:465 (Unknown error) in /www/a.php on line 5
  

以上是测试结果

找了google和度娘都没有解决,说什么证书问题

最后看到个修改方法的,临时用一下

修改 source/function/function_core.php

注释原来的函数,新增以下方法

function fsocketopen($hostname, $port = 80, &$errno, &$errstr, $timeout = 15) {
    $fp = '';
    if(function_exists('stream_socket_client')) {
        $contextOptions = array(
                    'ssl' => array(
                        'verify_peer' => false,
                        'verify_peer_name' => false
                    )
                );
                $context = stream_context_create($contextOptions);
                $fp = @stream_socket_client($hostname.':'.$port, $errno, $errstr, $timeout,STREAM_CLIENT_CONNECT, $context);
        }
    return $fp;
}
测试后可以正常放邮件,就是以后dz升级要注意下这块或者重新编译系统环境。

原文提示

一个php系统很早的了,后来把环境升级换成https与php5.6以后发现通信api不工作,通过排查发现是fsockopen函数的问题:

报错:Warning:  fsockopen(): SSL operation failed with code 1. OpenSSL Error messages:error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate



解决方法法改造一下fsockopen方法:

//不验证证书

$contextOptions = array(

    'ssl' => array(

        'verify_peer' => false,

        'verify_peer_name' => false

    )

);

//如果有签名的证书

/*

$contextOptions = array(

    'ssl' => array(

        'verify_peer' => true,

        'cafile' => '/path/to/cacert.pem',

        //'CN_match' => 'xcwmoon.net', // 匹配域名

        'ciphers' => 'HIGH:!SSLv2:!SSLv3',

        'disable_compression' => true,

    )

);

*/

$context = stream_context_create($contextOptions);

$fp = stream_socket_client("ssl://{$host}:{$port}", $errno, $errstr, $timeout, STREAM_CLIENT_CO
回复 支持 反对

使用道具 举报

17

主题

115

回帖

243

积分

炉火纯青

贡献
0 点
金币
97 个
 楼主| 发表于 2022-8-10 22:38:18 | 显示全部楼层
PHP 5.6.x中OpenSSL的变化 ¶
使用SSL/TLS时,流包装现在默认情况下会验证对等证书和主机名 ¶
默认情况下,所有加密的客户端流现在都启用对等验证。默认情况下,这将使用OpenSSL的默认CA包来验证对等证书。在大多数情况下,与具有有效SSL证书的服务器通信不需要进行任何更改,因为发行商通常将OpenSSL配置为使用已知良好的CA包。

通过设置openssl.cafile或openssl.capath配置设置,可以在全局基础上覆盖默认CA包,或者通过使用cafile或者capath上下文选项。

虽然通常不建议这样做,但是可以通过设置verify_peer上下文选项到false,并通过设置verify_peer_name上下文选项到false.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 关注公众号
  • 有偿服务微信
  • 有偿服务QQ

手机版|小黑屋|Discuz! 官方交流社区 ( 皖ICP备16010102号 |皖公网安备34010302002376号 )|网站地图|star

GMT+8, 2024-4-25 19:14 , Processed in 0.048987 second(s), 9 queries , Redis On.

Powered by Discuz! W1.0 Licensed

Cpoyright © 2001-2024 Discuz! Team.

关灯 在本版发帖
有偿服务QQ
有偿服务微信
返回顶部
快速回复 返回顶部 返回列表