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

OD1*_*995 10 python smtplib

我正在尝试使用 Gmail 创建一个发送电子邮件的脚本。但是,当运行以下行时,我的代码会冻结:

smtplib.SMTP("smtp.gmail.com", 587)
Run Code Online (Sandbox Code Playgroud)

这是在我输入用户名和密码之前,所以与我的 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()
Run Code Online (Sandbox Code Playgroud)

Chr*_*ine 9

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

这为我解决了这个问题。


Phi*_*hil 7

这很可能是防火墙或类似问题。在出现问题的计算机上,尝试在命令行上运行以下命令:

ping smtp.gmail.com
Run Code Online (Sandbox Code Playgroud)

假设可行,然后尝试:

telnet smtp.gmail.com 587
Run Code Online (Sandbox Code Playgroud)

我假设 Linux 机器上有这个命令。你需要适应别人。如果连接成功,请键入ehlo list命令,命令应显示一些信息。键入quit退出。

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

sudo iptables -L
Run Code Online (Sandbox Code Playgroud)

这将显示类似ACCEPT all下面的内容Chain INPUT,如果没有,您需要确保您接受已建立的连接,如下所示:

ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
Run Code Online (Sandbox Code Playgroud)

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

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