Swiftmailer Gmail连接超时 #110

4
我希望使用下面的PHP脚本和Swiftmailer发送通过Gmail的SMTP发送电子邮件。在我的自己的Web服务器上,这个脚本可以很好地运行。但是,在我为之创建此脚本的人的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);

我也遇到了这个问题。我通过将加密方式从“tls”更改为“ssl”来解决它。我看到你正在使用“ssl”,所以没有必要将此作为答案提供。然而,Google SMTP服务器是smtp.googlemail.com,与你的不同。 - Chloe
6个回答

6

哇...是啊,我在我的主机上也遇到了同样的问题,现在好了,谢谢你! - TheFrack

4

我有一个简单的解决方案来避免动态IP的问题(每次ping smtp.gmail.com时,我会看到最后三位数字块有轻微差异),那就是使用PHP内置的gethostbyname()实时读取IP。

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

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

1
只需添加 < /p>
74.125.130.108 smtp.gmail.com

将内容添加到服务器的hosts文件中。

0

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

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


0

我刚刚也遇到了完全相同的问题。我的本地工作正常,但一旦放到真实服务器上……不行。尽管所有设置都是一样的。

经过很多小时的努力,我想我已经找到了原因。

似乎在支持IPv4和IPv6的服务器上,IPv6优先。这是有道理的,因为它更新。但在smtp.gmail.com的情况下,它似乎只监听IPv4。因此,当服务器解析smtp.gmail.com时,它得到了IPv6地址,所以PHP试图连接它。最终会出现“连接超时”异常。你可能认为fsockopen会检测到连接不起作用,然后尝试IPv4,但似乎它并没有这样做。

如果你找到smtp.gmail.com的IPv4地址(ping smtp.gmail.com),并在代码中直接使用那个IP地址,它就可以工作:)

在IP地址中编码并不理想——因为Google随时可能更改它——但至少你可以发送一些电子邮件。


我也遇到了完全相同的问题。我同意使用静态IP并不好。下面的评论为我提供了一个选项,可以确保DNS返回IPv4:$this->setSourceIp('0.0.0.0'); - John Foley
Swift_TransportException Connection to tcp://173.194.204.16:465 Timed Out - Chloe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接