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 文档。
这解决了我的问题。
我正在尝试创建一个使用 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 文档。
这解决了我的问题。