Swiftmailer Gmail连接超时#110

时间:2014-08-22 14:33:30

标签: smtp swiftmailer

我想使用gmail的smtp发送电子邮件,并使用Swiftmailer发布下面的PHP脚本。现在这在我自己的网络服务器上工作正常。但是当我在人们的网络服务器上使用它时,我得到了一个例外:

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

可能是什么问题? 我假设它与服务器设置的差异有关,因为代码可以在我自己的网络服务器上运行。我已经用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);

6 个答案:

答案 0 :(得分:4)

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

nano /etc/gai.conf precedence :: ffff:0:0/96 100

按照: https://www.digitalocean.com/community/questions/outgoing-connections-on-port-25-587-143-blocked-over-ipv6

答案 1 :(得分:3)

我的简单解决方案,以避免动态IP的问题(每次我ping smtp.gmail.com我看到最后一个3digit块的细微差别),是简单地使用php内置gethostbyname()来读取IP实时。

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

答案 2 :(得分:2)

我在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');

答案 3 :(得分:0)

我刚刚在完全相同的问题上进行过战斗。我也在当地工作,但是一旦它上了真正的服务器......没有。即使所有设置都相同,它也行不通。

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

似乎发生的情况是,在支持IPv4和IPv6的服务器上,IPv6优先。这是有道理的,因为它更新。但在smtp.gmail.com的情况下,它似乎只听IPv4。因此,当服务器解析smtp.gmail.com时,它返回了IPv6地址,因此PHP尝试连接到它。最终放弃了#34;连接超时"例外。现在你会认为 fsockopen,可能会检测到连接没有工作,所以尝试使用IPv4,但看起来并没有。

如果您发现smtp.gmail.com的IPv4地址是什么(ping smtp.gmail.com),只需将那个 IP代替代码中的主机名 - 它工作:))

它在IP地址中不是理想的编码 - 鉴于Google可以随时更改它 - 但至少你会收到一些电子邮件

答案 4 :(得分:0)

只需添加

74.125.130.108 smtp.gmail.com

到服务器的主机文件

答案 5 :(得分:0)

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

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