Python 在 smtplib.SMTP 冻结("smtp.gmail.com",587)

Python freezes on smtplib.SMTP("smtp.gmail.com", 587)

我正在尝试创建一个使用 Gmail 发送电子邮件的脚本。但是,当下面的行是 运行:

时,我的代码冻结了
smtplib.SMTP("smtp.gmail.com", 587)

这是在我输入用户名和密码之前,所以与我的Gmail帐户无关。为什么会这样?我正在使用 Python 3.6.3

完整代码如下:

import smtplib

# Specifying the from and to addresses

fromaddr = 'XXX@gmail.com'
toaddrs  = 'YYY@gmail.com'

# Writing the message (this message will appear in the email)

msg = 'Enter you message here'

# Gmail Login

username = 'XXX@gmail.com'
password = 'PPP'

# Sending the mail  

server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(username,password)
server.sendmail(fromaddr, toaddrs, msg)
server.quit()

在您的代码中使用 server.ehlo()

代码片段:

server = smtplib.SMTP('smtp.gmail.com', 587)
server.ehlo()
server.starttls()

身份验证错误: http://joequery.me/guides/python-smtp-authenticationerror/

添加以下代码段并再次 运行。

try:
    server = smtplib.SMTP('smtp.gmail.com', 587)
    server.ehlo()
    server.starttls()
    server.login(username,password)
    server.sendmail(fromaddr, toaddrs, msg)
    server.close()
    print 'successfully sent the mail'
except:
    print "failed to send mail"

很可能是防火墙或类似问题。在有问题的机器上,在命令行上尝试 运行:

ping smtp.gmail.com

假设可行,然后尝试:

telnet smtp.gmail.com 587

我假设 Linux 机器有这个命令。你需要适应其他人。如果连接成功,输入 ehlo list 并且命令应该显示一些信息。输入 quit 退出。

如果这不起作用,请检查您的 iptables。

sudo iptables -L

这将在 Chain INPUT 下显示类似 ACCEPT all 的内容,否则,您需要确保您接受已建立的连接,例如:

ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED

输出链通常是打开的,但你也应该检查一下。

如果您使用的是 AWS,请检查您的安全组是否阻止传出连接。

如果它在对 smtplib.SMTP 的调用中挂起,并且服务器需要 SSL,那么问题很可能是您需要调用 smtplib.SMTP_SSL()(注意_SSL) 而不是在 ehlo 之后调用 smtplib.SMTP() 并随后调用 server.starttls()。有关详细信息,请参阅 SMTP_SSL 的 SMTPLib 文档。

这解决了我的问题。