Swiftmailer Gmail连接超时#110



我想使用gmail的smtp发送电子邮件,下面使用Swiftmailer发布PHP脚本。现在这在我自己的web服务器上工作得很好。但当我在用户的服务器上使用它时,我得到了一个异常:

    Fatal error: Uncaught exception 'Swift_TransportException' with message 'Connection could not be established with host smtp.gmail.com [Connection timed out #110]' in ...

有什么问题吗?我认为这与服务器设置的差异有关,因为代码在我自己的web服务器上工作。我用phpinfo()检查了以下内容:

- Registered Stream Socket Transports   tcp, udp, unix, udg, ssl, sslv3, sslv2, tls
- OpenSSL support   enabled 
- OpenSSL Library Version   OpenSSL 1.0.1e-fips 11 Feb 2013 
这是我的PHP代码:
    $emailname = MY_GMAIL_ACCOUNT_USERNAME;
    $emailpass = MY_GMAIL_ACCOUNT_PASSWORD;
    $transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, "ssl")
      ->setUsername($emailname)
      ->setPassword($emailpass);
    $mailer = Swift_Mailer::newInstance($transport);
    $message = Swift_Message::newInstance($emailtitle)
      ->setFrom(array($emailname.'@gmail.com' => $emailsender))
      ->setTo(array($emailrecp))
      ->setBody($emailbody,'text/html');
    $result = $mailer->send($message);

我在Digital Ocean服务器上遇到了同样的问题。原来他们默认在IPv6上阻止SMTP。修复方法如下:

纳米/etc/gai.conf优先级::ffff:0:0/96 100

按:https://www.digitalocean.com/community/questions/outgoing -连接-在-港- 25 - 587 - 143 -阻塞在ipv6

避免动态IP问题的简单解决方案(每次ping smtp.gmail.com时,我看到最后3位数字块略有不同),就是简单地使用php内置的gethostbyname()来实时读取IP。

 $smtp_host_ip = gethostbyname('smtp.gmail.com');
 $transport = Swift_SmtpTransport::newInstance($smtp_host_ip,465,'ssl')
   ->setUsername('username')->setPassword('pwd');

我在php和流方面并不先进,但似乎IPv6 DNS解析取决于路由器和/或isp。我换了供应商,换了新路由器,smtp连接总是超时。

要使用IPv6,您应该添加自己的IPv6强制stream_context_create使用IPv4。你可以在swiftmailer对象上调用setSourceIp(),或者直接修改Swift_SmtpTransport类(即在构造函数中)。

使用IPv6:

// replace IP with your own IPv6
$this->setSourceIp('2aaa:8a8:fc0:230:fds:4fd:faa:24ae');

使用IPv4(提到在https://github.com/phergie/phergie/issues/195):

$this->setSourceIp('0.0.0.0');

just add

74.125.130.108 smtp.gmail.com

我刚刚也遇到了同样的问题。我的游戏也在本地运行,但是一旦它进入了一个真正的服务器…不。即使所有的设置都是相同的,它也不会工作。

许多小时后,我想我已经找到原因了。

似乎发生的是,在服务器上与IPv4和IPv6支持,IPv6优先。这也说得通,因为它比较新。但在smtp.gmail.com的例子中,它似乎只监听IPv4。所以当服务器解析smtp.gmail.com时,它得到了它的IPv6地址,所以PHP试图连接到它。这最终以"连接超时"异常放弃。现在您可能会认为 fsockopen可能会检测到连接不工作,因此尝试使用IPv4,但似乎没有。

如果你发现smtp.gmail.com的IPv4地址是什么(ping smtp.gmail.com),并简单地把那个 IP在代码中的主机名的地方-它工作:)

这不是一个理想的IP地址编码-考虑到谷歌可以随时更改它-但至少你会收到一些电子邮件

我的答案是我的服务器阻塞了出站连接。它可能是你的防火墙或你的主机。

测试这一点的方法是尝试连接你自己。我在两台不同的机器上使用telnet进行比较,很明显这是我的问题。可能有一种方法可以直接使用curl来测试。

相关内容

最新更新