代码之家  ›  专栏  ›  技术社区  ›  Peter Quill

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

  •  1
  • Peter Quill  · 技术社区  · 7 年前

    在过去的两个月里,我一直在解决这个问题,但在如何解决这个问题上没有任何结果。我使用的是PHP 5.6.3和PEAR 1.10.1,所讨论的电子邮件页面与我们本地服务器上的三方电子邮件软件配合得很好,该软件仅用于SMTP的端口25。现在PHP页面确实引用了一个XML模板,该模板包含所有主机、密码和用户名信息。我想切换到使用带有SSL的google电子邮件服务器。我实施了电子邮件管理员提供的更改,并相应地更改了MX记录。它正常工作了两周。之后,我得到了以下错误

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

    我已经多次更改了代码,删除了ssl://,将协议类型更改为端口号为587的TLS,等等。什么都不起作用!我联系了承包商,用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]
    

    所以我在google上搜索了这个错误,并找到了php。用于更改openssl的ini文件。cafile和openssl。capath值。我输入了下载CA证书并输入了值的正确路径,但仍然不起作用。我把这些放错地方了吗?或者,是否有更简单的方法可以使用PEAR库解决此问题?请在此问题上提供任何帮助,我们将不胜感激!:)

    更新(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 回复  |  直到 7 年前
        1
  •  0
  •   sykez    7 年前

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

    您可以阅读更多关于 issues related to CA certificate 在里面 PHPMailer Troubleshooting Wiki .


    2018年2月20日更新:

    这个 卷曲cainfo公司 openssl。卡菲尔 路径看起来很好,假设这是到 cacert.pem 您已下载。然而,您的 ini_cafile 运行时为空 openssl_get_cert_locations() . 它应该反映出你在 openssl。卡菲尔 . 在对 php。ini公司 生效。重新启动后,检查 openssl。卡菲尔 运行值 phpinfo() ,并确保它是正确的。

    我不知道为什么默认的证书目录是这样的。可能是以前安装的Open SSL?不管怎样,这对我来说也是一条不存在的默认路径,但这并不重要,因为我的 ini\U cafile文件 显示我在中定义的相同值 openssl。卡菲尔 . openssl\u get\u cert\u locations() 显示了它将查找证书的位置列表,所以如果正确的位置在其中,我认为应该可以。