我正在尝试使用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()
答案 0 :(得分:3)
很可能是防火墙或类似问题。在有问题的计算机上,尝试在命令行上运行它:
ping smtp.gmail.com
假设有效,请尝试:
telnet smtp.gmail.com 587
我假设使用此命令的Linux机器。你需要适应别人。如果连接,请键入ehlo list
,命令应显示一些信息。输入quit
退出。
如果这不起作用,请检查您的iptables。
sudo iptables -L
这会在ACCEPT all
下显示Chain INPUT
,或者如果没有,则需要确保您接受已建立的连接,例如:
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
输出链经常打开,但你也应该检查一下。
如果您在AWS上,请检查您的安全组是否阻止传出连接。
答案 1 :(得分:1)
在代码中使用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"
答案 2 :(得分:1)
如果它挂在对smtplib.SMTP的调用中,并且服务器需要SSL,则最可能的问题是您需要调用smtplib.SMTP_SSL()(请注意_SSL )而不是在ehlo之后调用smtplib.SMTP()并随后对server.starttls()进行后续调用。有关更多详细信息,请参见SMTP_SSL的SMTPLib文档。
这为我解决了这个问题。