【问题标题】:Swiftmailer Gmail Connection timed out #110Swiftmailer Gmail 连接超时 #110
【发布时间】:2014-10-16 10:53:57
【问题描述】:

我想使用 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);

【问题讨论】:

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

标签: smtp swiftmailer


【解决方案1】:

我一直在与完全相同的问题作斗争。我的也在本地工作,但是一旦它在真正的服务器上......不。即使所有设置都相同,它也无法正常工作。

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

似乎发生的情况是,在支持 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');
  • Swift_TransportException Connection to tcp://173.194.204.16:465 Timed Out
【解决方案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】:

    我避免动态 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');
    

    【讨论】:

      【解决方案4】:

      只需添加

      74.125.130.108 smtp.gmail.com
      

      到服务器的主机文件

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

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

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

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

          【讨论】:

          • 哇...是的,我的主机上也发生了,现在可以使用,谢谢!
          猜你喜欢
          • 2016-10-19
          • 2016-10-26
          • 2011-10-12
          • 1970-01-01
          • 2014-03-01
          • 2021-06-01
          • 2018-01-31
          • 2016-06-07
          相关资源
          最近更新 更多