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

时间:2018-05-31 12:10:31

标签: python 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()

3 个答案:

答案 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文档。

这为我解决了这个问题。