[SMTP:无法连接套接字:fsockopen():无法连接到ssl://smtp.gmail.com:465(未知错误)(代码:-1,响应:)

时间:2018-02-20 00:57:12

标签: php ssl smtp gmail pear

过去两个月我一直在对此问题进行排查,并且没有找到如何解决此问题的结果。我正在使用PHP 5.6.1和PEAR 1.10.1,有问题的电子邮件页面在我们的本地服务器上使用我们的三方电子邮件软件正常工作,该软件仅设计为使用端口25进行SMTP。现在,PHP页面确实引用了一个包含所有主机,密码和用户名信息的XML模板。我想切换到使用SSL的谷歌电子邮件服务器。我实施了电子邮件管理员提供的更改,并相应地更改了MX记录。它运作正常两周。之后我收到以下错误

"无法连接到ssl://smtp.gmail.com:465 [SMTP:无法连接套接字:fsockopen():无法连接到ssl:// smtp。 gmail.com:465(未知错误)(代码:-1,响应:)]"

我已多次更改代码,我删除了ssl://,我已将协议类型更改为TLS,端口号为587等。没有任何工作!我联系承包商构建了一个简单的硬编码页面,它只是使用gmail服务器配置来表示hello world。他拒绝并让自己做了一个简单的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]

所以我用Google搜索了这个错误,并导致php.ini文件更改了openssl.ca文件和openssl.capath值。我输入了下载CA证书并输入了正确的值路径,但它仍然无效。我把它们放在错误的区域吗?或者是否有更简单的方法来解决使用PEAR库的问题?如果您对此主题有任何帮助,我们将不胜感激!:)

UPDATE(2018年2月20日):

我已下载该捆绑包,并设置了正确的位置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 = 

我似乎做错了或者需要知道如何更改位置,因为我的计算机上不存在这些位置,而且当我改变路径时,我不明白它是如何进行的。配置文件本身。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

显然它仍然是证书问题。尝试使用latest CA certificates extracted from Mozilla。只需下载它,将其放置在某处或替换当前的cacert.perm,将证书路径添加到openssl.cafile中的curl.cainfophp.ini,然后重试。您现在可能想要评论openssl.capath

您可以在issues related to CA certificate中详细了解PHPMailer Troubleshooting Wiki

02/20/2018更新:

curl.cainfoopenssl.cafile路径看起来很好,假设这是您下载的cacert.pem的正确路径。但是,当您运行ini_cafile时,openssl_get_cert_locations()为空。它应该反映您在openssl.cafile中设置的内容。在对php.ini进行更改后,您需要重新启动Web服务器(Apache / nginx)才能生效。重新启动后,运行openssl.cafile检查phpinfo()值,并确保其正确无误。

我不确定为什么默认的cert目录是这样的。也许之前安装的Open SSL?无论哪种方式,它对我来说都是不存在的默认路径,但它并不重要,因为我的ini_cafile显示了我在openssl.cafile中定义的相同值。 openssl_get_cert_locations()显示了它将要查找证书的地方列表,因此如果其中包含正确的证书,我认为应该没问题。