0

当我尝试连接到 Gmail 服务器时,python 会抛出一个错误:

>>> from smtplib import SMTP
>>> m = SMTP('smtp.gmail.com', 587)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\smtplib.py", line 249, in __init__
    (code, msg) = self.connect(host, port)
  File "C:\Python27\lib\smtplib.py", line 309, in connect
    self.sock = self._get_socket(host, port, self.timeout)
  File "C:\Python27\lib\smtplib.py", line 284, in _get_socket
    return socket.create_connection((port, host), timeout)
  File "C:\Python27\lib\socket.py", line 571, in create_connection
    raise err
socket.error: [Errno 10060] 

输出的其余部分是不同的语言,但它基本上表示主机 (gmail) 没有响应。

我可以在工作时在浏览器上看到我的电子邮件,可能是网络配置不允许我自动发送电子邮件。

有没有办法让 python 充当常规浏览器?

4

1 回答 1

-1

首先,您只能通过某种形式的身份验证作为客户端访问 gmail 的 SMTP 服务器;推荐的方法是使用 oauth。有关详细信息,请参阅此页面页面。因此,即使您解决了这个问题,您的代码也不会工作。

但是,这并不能解释为什么它甚至在您有机会登录之前就拒绝您的连接。

最可能的可能性是 gmail 的路由器正在维护 IP 的动态白名单。当您使用其他类型的正确登录连接时,您会被添加到白名单 N 秒,这意味着您可以连接到端口 587;否则,你会被拒绝。这将类似于传统的 SMTP-after-IMAP 身份验证方案,但不限于 IMAP,并在路由器而不是 SMTP 服务处处理(可能是为了降低成本或使 DoS 攻击更加困难)。

有一个很好的测试方法:配置 Outlook、Mail.app 或其他知道如何连接到 gmail 并使用 SMTP 通过 gmail 发送邮件的邮件客户端。在邮件客户端中获取邮件后几秒钟运行您的脚本。如果它有效,那就是问题所在。在这种情况下,解决方法是执行与邮件客户端相同的连接和登录(IMAP?Web 服务?)。

或者,当然,您可以使用谷歌在上述链接中提供的示例代码,而不是从第一原理开始。

(当然,gmail 也必须接受服务器到服务器的 SMTP 连接,但是他们可以很容易地为此使用不同的身份验证方案。我假设您正在尝试进行客户端到服务器的连接,而不是服务器-到服务器。)

另一种可能性是您在某种黑名单上——例如,gmail 认为您的 IP 属于垃圾邮件发送者。这也可能是动态的——可能任何连接到端口 587 但没有正确 oauth 的人在接下来的 N 秒内都会被阻止。无论如何,这也很容易测试:配置 Outlook、Mail.app 等。如果这是问题所在,他们也将无法发送邮件。

还有第三种可能性,即不允许任何人连接到端口 587,而 Google 希望您改用端口 565 或 25。

为了更容易调试,您可能需要考虑编写一个更简单的脚本,它只创建一个套接字并连接,而不是使用 smtplib:

import socket
s = socket.socket()
s.connect(('smtp.gmail.com', 587))

或者,更简单地说,只是命令行中的 netcat:

nc smtp.gmail.com 587

要回答您的附带问题:

有没有办法让 python 充当常规浏览器?

那不是问题。普通浏览器不建立 SMTP 连接;它使用从 gmail.com 下载的 Javascript 代码建立 Web 服务连接。

当然 Python 也可以建立 Web 服务连接。

并且它可以像“常规浏览器”(例如,User-Agent、Referer 等标头)一样多或少,但这可能不相关——gmail Web 服务 API 是公开的并且具有关于如何验证自己的明确、公开的规则(在这种情况下,您只需按照规则所说的去做),或者它是私人的,除非您想参加军备竞赛,否则您不应该试图欺骗他们使用的任何保护措施。

无论如何,在这种情况下,我们知道它是public,所以我们不必猜测。

于 2012-10-30T21:47:38.097 回答