我正在尝试使用 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)
如果它挂在对 smtplib.SMTP 的调用中,并且服务器需要 SSL,那么最有可能的问题是您需要调用 smtplib.SMTP_SSL() (注意 _SSL),而不是在后续调用中调用 smtplib.SMTP() ehlo 之后的 server.starttls() 。有关更多详细信息,请参阅 SMTP_SSL 的 SMTPLib 文档。
这为我解决了这个问题。
这很可能是防火墙或类似问题。在出现问题的计算机上,尝试在命令行上运行以下命令:
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,请检查您的安全组是否阻止传出连接。