【问题标题】:PearMailer, PHP7, and OpenSSL unable to connect to gmail with unknown errorPearMailer、PHP7 和 OpenSSL 无法连接到 gmail,出现未知错误
【发布时间】:2016-10-22 11:02:12
【问题描述】:

我正在建立一个网站,其中一部分需要发送电子邮件(一个用于帐户密码重置链接,另一个用于一般用户管理员联系)。我一直在使用 PearMailer 通过 GMail 帐户发送电子邮件,而且效果很好……直到现在。出于某种原因,它已停止发送电子邮件,它给了我这个非常无益的错误:

 [message] => Failed to connect to ssl://smtp.gmail.com:465 [SMTP: Failed to connect socket: fsockopen(): unable to connect to ssl://smtp.gmail.com:465 (Unknown error) (code: -1, response: )

openSSL 已启用,并且我使用的所有凭据都是正确的(我可以使用它们手动登录该 GMail 帐户)。

这是我正在使用的代码,其中 $config 保存帐户凭据,$_POST 数据来自“联系我们”表单(在我开发时忽略它缺乏清理):

    require_once "Mail.php";
        $params=array(
            "host"=>"ssl://smtp.gmail.com",
            "port"=>465,
            "auth"=>true,
            "username"=>$config["mailFrom"],
            "password"=>$config["mailPass"]
        );
        $headers=array(
            "To"=>$config["mailFrom"],
            "From"=>$_POST['user']." <".$_POST["reply-to"].">",
            "Content-type"=>"text/html",
            "Subject"=>$_POST['subject']
        );
        $mail=Mail::factory("smtp", $params);
        $sent=$mail->send($config["mailFrom"], $headers, htmlentities($_POST['body']));

它应该向我的 GMail 帐户发送一封来自它自己的电子邮件,但它却给了我上面提到的错误。在更改了往返地址之后,无论如何,它仍然给我那个错误。这特别奇怪,因为我一直在使用几乎相同的代码来发送密码重置链接,并且直到现在都可以正常工作;当然,它现在也无法连接。

我找不到任何说 Google 已更改其设置的信息,而且我绝对没有超过 smtp.gmail.com 应该允许的每天 2,000 条消息的限制,所以这里发生了什么?

【问题讨论】:

    标签: php email pear php-openssl pear-mail


    【解决方案1】:

    我的解决方案:从 PearMailer 切换到 SwiftMailer,其中,我使用 $transport-&gt;setStreamOptions 将 SSL 选项 verify_peerverify_peer_name 设置为 false。这似乎现在发送邮件就好了。 (如果不禁用这些选项,显然 GMail 的 SSL 证书与较新版本的 PHP 不兼容。去看看。)

    【讨论】:

    • php 本身不进行 ssl 验证,它依赖于系统接受的 ssl 根证书。你需要修复你的服务器。
    • 无效的证书会不会来自 GMail 的服务器,从而使其成为问题并且无法修复? (我在 SSL 安全方面没有太多经验,所以我不知道我现在在说什么......)
    • 可以,但几率很低。
    【解决方案2】:

    编辑:

    我不确定这是否适合您,请尝试:

    $params=array(
                "host"=>"smtp.gmail.com",
                "port"=>587,
                "auth"=>true,
                "username"=>$config["mailFrom"],
                "password"=>$config["mailPass"]
            );
    

    这将使用 TLS 而不是 SSL。试试看吧。

    【讨论】:

    • 正如我所说,openssl 已经启用。这不是问题。
    • 好吧,现在我得到一个不同的错误:[message] =&gt; authentication failure [SMTP: STARTTLS failed (code: 220, response: 2.0.0 Ready to start TLS)] [userinfo] 如前所述,我已经验证了凭据自己的工作。一些谷歌搜索告诉我 PearMailer 在 PHP5.6 及以上使用 TLS 时效果不佳;您有什么更好的 smtp 系统供我使用的建议吗?
    • 嗨,查看this post,@matuha 回复。
    • 谢谢,但是在您之前的编辑之后,我切换到了 SwiftMailer 而不是 PearMailer。经过一番谷歌搜索和禁用 SSL 对等验证后,我能够通过 SSL 完成所有工作 :) 不过,您的回答为我指明了正确的方向,所以谢谢 :) 对于那些想知道的人:我现在正在使用 SwiftMailer,并将 SSL 流选项中的 verify_peer 和 verify_peer_name 选项设置为 false。这似乎可以解决问题:)
    • 没问题。祝你好运。
    猜你喜欢
    • 1970-01-01
    • 2016-08-06
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    • 2012-10-30
    • 1970-01-01
    相关资源
    最近更新 更多