PEAR Mail无法连接到Gmail SMTP,无法连接到套接字

时间:2017-08-29 15:20:34

标签: php sockets email ssl pear

事实

我正在使用PEAR Mail,我想使用gmail SMTP发送邮件。我有Apache / 2.4.27(Win64)PHP / 7.2.0beta3,PEAR 1.10.15,Mail 1.4.1,Net_SMTP 1.8.0,Net_Socket 1.2.2。

我去了php.ini并添加了extension = php_openssl.dllerror.log没有给出与ssl相关的错误。

这是代码

require_once "Mail.php";

$from = '<slevin@gmail.com>';
$to = '<slevinkelevra@gmal.com>';
$subject = 'Hi!';
$body = "Hi,\n\nHow are you?";

$headers = array(
    'From' => $from,
    'To' => $to,
    'Subject' => $subject
);

$smtp = Mail::factory('smtp', array(
        'host' => 'ssl://smtp.gmail.com',
        'port' => '465',
        'auth' => true,
        'username' => 'slevinmail@gmail.com',
        'password' => 'mypassword'
    ));

$mail = $smtp->send($to, $headers, $body);

if (PEAR::isError($mail)) {
    echo('<p>' . $mail->getMessage() . '</p>');
} else {
    echo('<p>Message successfully sent!</p>');
}

问题

我收到此错误

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: )]

我不知道该怎么做,我用Google搜索但是我更加困惑。

请告知如何解决这个问题。谢谢

更新

按照symcbean的说明,我得到了以下结果:

bool(true) 

array(5) { 
[0]=> string(31) "alt3.gmail-smtp-in.l.google.com" 
[1]=> string(26) "gmail-smtp-in.l.google.com" 
[2]=> string(31) "alt4.gmail-smtp-in.l.google.com" 
[3]=> string(31) "alt1.gmail-smtp-in.l.google.com" 
[4]=> string(31) "alt2.gmail-smtp-in.l.google.com" } 
IPV4 address = 64.233.188.27

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 = C:\Program Files\Common Files\SSL/cert.pem
default_cert_file_env = SSL_CERT_FILE
default_cert_dir = C:\Program Files\Common Files\SSL/certs
default_cert_dir_env = SSL_CERT_DIR
default_private_dir = C:\Program Files\Common Files\SSL/private
default_default_cert_area = C:\Program Files\Common Files\SSL
ini_cafile = 
ini_capath = 

If all good so far, then this bit should work....
fsockopen 
Warning: fsockopen(): SSL operation failed with code 1. OpenSSL Error messages: error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed in C:\Apache24\htdocs\phptest2.php on line 28

Warning: fsockopen(): Failed to enable crypto in C:\Apache24\htdocs\phptest2.php on line 28

Warning: fsockopen(): unable to connect to ssl://smtp.gmail.com:465 (Unknown error) in C:\Apache24\htdocs\phptest2.php on line 28
bool(false) int(0) string(0) "" 

第28行是这一行var_dump(fsockopen("ssl://smtp.gmail.com", 465, $errno, $errstr, 3.0));

再次感谢

更新#2

我用google搜索&#34; fsockopen():SSL操作失败,代码为1。&#34;第一次警告

结束here。我改变了AVG的邮件端口,就像答案一样。 symcbean的代码运行没有错误,但我的代码回复了 mail error : authentication failure [SMTP: Invalid response code received from server (code: 534, response: 5.7.14 Please log in via your web browser and 5.7.14 then try again. 5.7.14 Learn more at 5.7.14 https://support.google.com/mail/answer/78754 c1sm1243434wre.84 - gsmtp)]

所以我用Google搜索了code: 534, response: 5.7.14并结束了here,按照emgh3i的第一个回答的说明,启用了较少的安全连接并允许访问我的Google帐户

现在它工作得很好。

9 个答案:

答案 0 :(得分:6)

您的host配置不应包含该协议。它失败的原因是它可能试图在ssl://smtp.gmail.com上执行DNS查找并失败。

更改

'host' => 'ssl://smtp.gmail.com',

'host' => 'smtp.gmail.com',

答案 1 :(得分:6)

调试步骤很少:

1。检查phpinfo

我建议检查phpinfo()以检查是否所有模块都已启用。检查邮件,fsocketopen。

2。启用调试标志

启用debug标记以确切检查问题所在。如下。

$smtp = Mail::factory('smtp', array(
        'host' => 'ssl://smtp.gmail.com',
        'port' => '465',
        'auth' => true,
        'debug' => true,
        'pipelining' => true,
        'username' => 'xxx@gmail.com',
        'password' => 'xxx'
    ));

在我的机器上运行上面的代码后,我得到了跟进响应。问题可能与您的不同。但调试帮助了我。因为我启用了2FA,它给了我错误。我也收到了一封邮件,我的登录信息被阻止了。

DEBUG: Recv: 220 smtp.gmail.com ESMTP s65sm4891344pfi.36 - gsmtp DEBUG: Send: EHLO localhost DEBUG: Recv: 250-smtp.gmail.com at your service, [110.227.210.84] DEBUG: Recv: 250-SIZE 35882577 DEBUG: Recv: 250-8BITMIME DEBUG: Recv: 250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH DEBUG: Recv: 250-ENHANCEDSTATUSCODES DEBUG: Recv: 250-PIPELINING DEBUG: Recv: 250-CHUNKING DEBUG: Recv: 250 SMTPUTF8 DEBUG: Send: AUTH LOGIN DEBUG: Recv: 334 VsadfSFcm5hbWU6 DEBUG: Send: cGF0ZWwuZ29wYhkafdaASFnbWFpbC5jb20= DEBUG: Recv: 334 UGFzc3dvcmQ6 DEBUG: Send: OWwzMy5zaHlAbTE4 DEBUG: Recv: 534-5.7.14 Please log in via your web browser and DEBUG: Recv: 534-5.7.14 then try again. DEBUG: Recv: 534-5.7.14 Learn more at DEBUG: Recv: 534 5.7.14 https://support.google.com/mail/answer/78754 s65sm4891344pfi.36 - gsmtp DEBUG: Send: RSET DEBUG: Send: QUIT DEBUG: Recv: 250 2.1.5 Flushed s65sm4891344pfi.36 - gsmtp DEBUG: Recv: 221 2.0.0 closing connection s65sm4891344pfi.36 - gsmtp
authentication failure [SMTP: Invalid response code received from server (code: 534, response: 5.7.14 Please log in via your web browser and 5.7.14 then try again. 5.7.14 Learn more at 5.7.14 https://support.google.com/mail/answer/78754 s65sm4891344pfi.36 - gsmtp)]

更新

您的问题看起来像PHP甚至无法连接到gmail服务器。

答案 2 :(得分:6)

本指南的"Use the Gmail SMTP Server"部分说明您需要enable "Less secure apps"

答案 3 :(得分:4)

您的代码是正确的

我试图测试我的Gmail帐户。邮件发送成功。

检查套接字连接

<?php

error_reporting(E_ALL);

var_dump(fsockopen("ssl://smtp.gmail.com", 465, $errno, $errstr));
var_dump($errno);
var_dump($errstr);
  

类型(流)的资源(4)

     

INT(0)

     

string(0)&#34;&#34;

答案 4 :(得分:2)

在开始之前,我先说一下,您的服务器和谷歌服务器之间可能存在许多可能的解决方案和结果,因此这些可能适用于不同的人,也可能不适用。

1) SMTP不是很安全,因此Google可能会拒绝您的请求。我在6个月前遇到了这个问题,解决方案是在'myaccount.google.com'下启用不安全的应用

enter image description here

2)如果这对您不起作用,那么您可以考虑切换协议。

'host' => 'ssl://smtp.gmail.com',

'host' => 'tls://smtp.gmail.com:587';

答案 5 :(得分:2)

到目前为止,Kyung-yoong是唯一为解决问题做出有意义贡献的人(+1 Been!)。我可以证实他的结果。我会建议你尝试相同的。您目前正在尝试调试相当复杂的组件堆栈:

一直在为你做你的工作 - 正如发布问题的人 - 应该创建一个Minimal, Complete, and Verifiable example

希望这也能提供更有意义的诊断信息。

失败的最可能原因是:

  • 您运行此主机的主机无法将传出连接路由到互联网(但由于您似乎使用的是台式PC,我认为您现在可能已经注意到了这一点)
  • 代码在安全沙箱中运行(但MSWindows确实没有这样的东西)
  • 主机无法解析主机名(请参阅有关路由的第一点)
  • 主机可以连接但无法验证证书

因此,您可能会考虑更详细的测试脚本实现:

 <?php

 error_reporting(E_ALL);

 print "DNS\n";
 var_dump(getmxrr('gmail.com',$result));
 var_dump($result);
 $use_ip=gethostbyname($result[0]);
 print "IPV4 address = $use_ip\n";

 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";
 }

 print "\nIf all good so far, then this bit should work....\n";
 print "fsockopen\n";
 var_dump(fsockopen("ssl://smtp.gmail.com", 465, $errno, $errstr, 3.0));
 var_dump($errno);
 var_dump($errstr);

哪个应该给你这样的回复:

 DNS
 bool(true)
 array(5) {
   [0]=>
   string(31) "alt1.gmail-smtp-in.l.google.com"
   [1]=>
   string(31) "alt2.gmail-smtp-in.l.google.com"
   [2]=>
   string(31) "alt4.gmail-smtp-in.l.google.com"
   [3]=>
   string(26) "gmail-smtp-in.l.google.com"
   [4]=>
   string(31) "alt3.gmail-smtp-in.l.google.com"
 }
 IPV4 address = 74.125.131.26

 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 = /usr/lib/ssl/cert.pem
 default_cert_file_env = SSL_CERT_FILE
 default_cert_dir = /usr/lib/ssl/certs
 default_cert_dir_env = SSL_CERT_DIR
 default_private_dir = /usr/lib/ssl/private
 default_default_cert_area = /usr/lib/ssl
 ini_cafile =
 ini_capath =

 If all good so far, then this bit should work....
 fsockopen
 resource(4) of type (stream)
 int(0)
 string(0) ""

鉴于我们无法复制您的错误,我们无法明确回答问题所在 - 但我的猜测是you haven't configure openSSL

答案 6 :(得分:2)

当事情失败时,我们不知道原因,我们必须做调试。所以这里不是回答我要求你执行一些测试

  1. 确认系统与互联网的连接:打开cmd终端并输入

    ping smtp.gmail.com
    
  2. 确认防火墙:在cmd终端中输入以下内容

    telnet smtp.gmail.com 465
    
  3. 确认php设置:在cmd终端输入php -a,然后在php提示符下执行(复制/粘贴然后按回车键)代码。

    $result = fsockopen('ssl://smtp.gmail.com', 465, $error_no, $error_message, 5);
    if ($result === false) {
      echo "error no: $error_no error message: $error_message";
      echo print_r($result, true);
    } else {
      echo 'success';
    }
    
  4. 确认Pear Mail库和Gmail SMTP访问:再次在cmd和php提示符php -a执行您自己的代码(正如您在此主题中发布的那样)

  5. 让我们知道它在哪里,以及错误是什么。只有在那之后我们才能提供帮助

答案 7 :(得分:0)

在PHP 5.3中,其他人提供了关于&#34;不太安全的应用程序的提示,&#34;登录到您的Google Gmail帐户时需要激活,解决了我的所有问题。

在PHP 7.2中,我必须做更多的事情:设置&#39; auth&#39;到PLAIN然后添加&#34; verify_peer&#34;和ssl socket_options的verify_peer_name如下:

$mail= Mail::factory('smtp', array('host' => 'ssl://smtp.gmail.com',
                                   'port' => '465',
                                   'auth' => 'PLAIN',
                                   'socket_options' => array('ssl' => array('verify_peer' => false,
                                                                            'verify_peer_name' => false)),
                                   'username' => 'someAccount@gmail.com',
                                   'password' => 'myPassword'
));

答案 8 :(得分:0)

这可能与问题没有直接关系,但对于通过远程服务器使用 Pear SMTP 发送电子邮件时遇到问题的任何人,真正的问题不是防火墙配置而是 SELINUX。如果打开,这是默认设置,您可能会花几天的时间想知道为什么权限被拒绝。只需告诉 selinux 允许 apache 发送电子邮件:

setsebool -P httpd_can_sendmail 1

我希望这可以为某人省去麻烦。