[英]How to resolve the error: Message: fsockopen(): unable to connect to ssl://smtp.gmail.com:465 (Connection refused)
[英][SMTP: Failed to connect socket: fsockopen(): unable to connect to ssl://smtp.gmail.com:465 (Unknown error) (code: -1, response: )]
在过去的两个月中,我一直在对该问题进行故障排除,但在解决此问题方面没有任何结果。 我使用的是PHP 5.6.3和PEAR 1.10.1,有问题的电子邮件页面与本地服务器上的仅用于端口25的SMTP的3方电子邮件软件配合良好。 现在,PHP页面确实引用了包含所有主机,密码和用户名信息的XML模板。 我想切换为使用带有SSL的Google电子邮件服务器。 我实施了电子邮件管理员提供的更改,并相应地更改了MX记录。 它正常运行了两个星期。 之后,我得到以下错误
“无法连接到ssl://smtp.gmail.com:465 [SMTP:无法连接套接字:fsockopen():无法连接到ssl://smtp.gmail.com:465(未知错误)(代码: -1,响应:)]“ 。
我已经多次更改了代码,删除了ssl://,将协议类型更改为TLS,端口号为587,等等。什么都没用! 我与承包商联系,以使用gmail服务器配置来构建一个简单的硬编码页面,该页面刚刚说出了问候世界。 他拒绝了,让我自己制作了一个简单的php页面,请记住,到目前为止,我在PHP编程方面的背景还为零。因此,顺便说一句,很高兴这被我抛弃了,但是无论我是否完成了任务。 我有一个页面,它使用smtp服务器以及使用PHPMailer库所需的帐户来发送一条简单的消息。 (请参见下面的代码)
<?php
require_once 'C:\Webpage\PHPMailer-5.2-stable/PHPMailerAutoload.php';
$mail = new PHPMailer();
$mail->isSMTP();
$mail->SMTPAuth = true;
$mail->SMTPDebug = SMTP::DEBUG_SERVER;
$mail->SMTPDebug = 4; // 2 to enable SMTP debug information
$mail->Host = 'smtp.gmail.com';
$mail->Username = 'username@gmail.com';
$mail->Password = 'XXXXXXXXXXXXXXXXXXX';
$mail->SMTPSecure ='ssl';
$mail->Port = 465;
/*$mail->SMTPOptions = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
//'allow_self_signed' => true
)
);*/
$mail->From = 'XXXXt@abc.com';
$mail->FromName = 'Example';
$mail->addReplyTo('testing@abc.com','Example');
$mail->AddAddress('user1@xyz.com', 'John Doe');
$mail->Subject = 'Hello World';
$mail->Body ='A test email!';
$mail->AltBody = 'A test email!';
if(!$mail->Send()) {
echo "Mailer Error: " . $mail->ErrorInfo;
} else {
echo "Message has been sent";
}
?>
现在,我知道这并没有使用PEAR,但是从中我发现了一些我认为相关的有趣信息。 该代码仅在以下行有效
$mail->SMTPOptions = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
//'allow_self_signed' => true
)
);
被注释掉是行不通的,但是注释掉后,我会收到关于此的错误消息。
Connection failed. Error #2: stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages:error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed [C:\Webpage\PHPMailer-5.2-stable\class.smtp.php line 299]
所以我用谷歌搜索了这个错误,导致php.ini文件更改了openssl.cafile和openssl.capath值。 我输入了下载的CA证书,并为这些值输入了正确的路径,但是仍然无法正常工作。 我会将它们放在错误的区域吗? 还是有使用PEAR库解决此问题的简便方法? 请对此主题的任何帮助将不胜感激!:)
更新(02/20/2018):
我已经下载了捆绑软件,并将路径设置为正确的位置, curl.cainfo ="C:\\OpenSSL-Win64\\bin\\PEM\\cacert.pem"
, openssl.cafile="C:\\OpenSSL-Win64\\bin\\PEM\\cacert.pem"
。 我仍然遇到错误,我对ssl位置进行了以下检查,以查看它是否使用了php.ini
文件并得到了以下内容。
<?php
error_reporting(E_ALL);
print "\nIf you've got this far without errors then problem is with your SSL config\n";
$calocns=openssl_get_cert_locations();
if (count($calocns)) {
print "Check you've got your cacerts deployed in one of the following locations\n";
foreach ($calocns as $k=>$v) print "$k = $v\n";
} else {
print "You've not configured your openssl installation on this host\n";
}
$calocns=openssl_get_cert_locations();
//var_dump(openssl_get_cert_locations());
?>
结果:
If you've got this far without errors then problem is with your SSL config Check you've got your cacerts deployed in one of the following locations default_cert_file = f:\repo\winlibs_openssl_vc11_x86/cert.pem default_cert_file_env = SSL_CERT_FILE
default_cert_dir = f:\repo\winlibs_openssl_vc11_x86/certs
default_cert_dir_env = SSL_CERT_DIR
default_private_dir = f:\repo\winlibs_openssl_vc11_x86/private
default_default_cert_area = f:\repo\winlibs_openssl_vc11_x86
ini_cafile =
ini_capath =
我似乎做错了此事,或者需要知道如何更改位置,因为这些位置在我的计算机上不存在,并且当我在配置文件本身中更改路径时,默认情况下我不知道该如何处理这些位置。 有什么想法吗?
显然,这仍然是证书问题。 尝试使用从Mozilla提取的最新CA证书 。 只需下载它,将其放置在某个地方或替换当前的cacert.perm
,将证书的路径添加到php.ini
openssl.cafile
和curl.cainfo
,然后重试。 您可能现在要评论openssl.capath
。
您可以在PHPMailer故障排除Wiki中阅读有关与CA证书有关的问题的更多信息 。
2018年2月20日更新:
curl.cainfo
和openssl.cafile
路径看起来不错,假设这是您下载的cacert.pem
的正确路径。 但是,当您运行openssl_get_cert_locations()
时,您的ini_cafile
为空。 它应该反映您在openssl.cafile
设置的任何内容。 对php.ini
进行更改后,您将需要重新启动Web服务器(Apache / nginx)。 重新启动后,通过运行phpinfo()
检查openssl.cafile
值,并确保它是正确的。
我不确定为什么默认的证书目录是这样的。 也许是以前安装的Open SSL? 无论哪种方式,这对我来说都不是默认路径,但这并不重要,因为我的ini_cafile
显示的是我在openssl.cafile
定义的相同值。 openssl_get_cert_locations()
显示了它将在其中查找证书的位置的列表,因此,如果其中包含正确的证书,我认为应该没问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.