Python:发送电子邮件时,始终在以下子句中阻止:smtpserver=smtplib.SMTP(“SMTP.gmail.com”,587)

Python:发送电子邮件时,始终在以下子句中阻止:smtpserver=smtplib.SMTP(“SMTP.gmail.com”,587),python,email,smtp,gmail,Python,Email,Smtp,Gmail,我正在编写一个Python程序来发送电子邮件。但每次执行本条款时: smtpserver = smtplib.SMTP("smtp.gmail.com",587) 它将在此处阻塞,并始终保持执行状态,无任何提示和错误。我不知道为什么。有人能帮我吗 代码如下: 导入smtplib to = 'toemail@gmail.com' gmail_user = 'user@gmail.com' gmail_pwd = 'password' smtpserver = smtplib.SMTP("smtp

我正在编写一个Python程序来发送电子邮件。但每次执行本条款时:

smtpserver = smtplib.SMTP("smtp.gmail.com",587)
它将在此处阻塞,并始终保持执行状态,无任何提示和错误。我不知道为什么。有人能帮我吗

代码如下: 导入smtplib

to = 'toemail@gmail.com'
gmail_user = 'user@gmail.com'
gmail_pwd = 'password'
smtpserver = smtplib.SMTP("smtp.gmail.com",587)
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.ehlo
smtpserver.login(gmail_user, gmail_pwd)
header = 'To:' + to + '\n' + 'From: ' + gmail_user + '\n' + 'Subject:testing \n'
print header
msg = header + '\n this is test msg from mkyong.com \n\n'
smtpserver.sendmail(gmail_user, to, msg)
print 'done!'
smtpserver.close()

连接可能存在一些问题(可能是被代理或防火墙阻止了?),超时时间可能非常长,您看不到它进一步发展

说:

类smtplib.SMTP([host[,port[,local_hostname[,timeout]]])

(…)如果指定的
主机
没有正确响应,将引发
SMTPConnectError
。可选的
timeout
参数以秒为单位指定阻塞操作(如未指定,将使用全局默认超时设置)的超时

请尝试自己指定超时:

smtpserver = smtplib.SMTP("smtp.gmail.com", 587, timeout=30)

作为参考,cpython smtplib是阻塞的。也就是说,它在连接时阻塞了GIL(即Python)。尽管声称GIL是在I/O上发布的,但它只在某些I/O上发布,SMTP连接不是这样。
要使其异步,您需要将邮件发送到另一个进程或线程,具体取决于您的情况

也许我晚了4年,但这对我来说很有用,可能会帮助别人

server = smtplib.SMTP("smtp.gmail.com", 587, None, 30)

我遇到了一个类似的问题,上面的答案都不适合我。我的问题是,因为我的smtp服务器使用SSL。我需要使用
smtplib.SMTP\u SSL
而不是
smtplib.SMTP
。我只是在下面发布了我的完整工作代码。 确保在执行之前更改
req
email\u config
的值

req={
“电子邮件”:to@something.com",
“主题”:“来自python的新电子邮件”,
“身体”:“你好,我是机器人”,
}
电子邮件配置={
“服务器”:“smtp.orange.fr”,
“港口”:465,
“用户名”:”username@orange.fr",
“密码”:“我的密码”,
“电子邮件”:fromwhichemail@orange.fr",
}

#!/usr/bin/env蟒蛇3
导入smtplib
从电子邮件导入编码器
从email.mime.base导入MIMEBase
从email.mime.multipart导入MIMEMultipart
从email.mime.text导入MIMEText
类邮件(对象):
定义初始化(自我、电子邮件配置):
self.email=email\u config[“email”]
self.password=email_config[“password”]
self.server=电子邮件配置[“服务器”]
self.port=email_config[“端口”]
打印(f“记录到{self.server}:{self.port}”)
session=smtplib.SMTP\u SSL(self.server,self.port)
打印(f“呼叫ehlo”)
session.ehlo()
打印(f“调用登录”)
session.login(self.email、self.password)
self.session=会话
def发送消息(自我、主题、收件人、正文、文件名):
#创建多部分消息并设置标题
message=MIMEMultipart()
message[“From”]=self.email
信息[“至”]=至
消息[“主题”]=主题
消息[“密件抄送”]=“”
#将正文添加到电子邮件
消息。附加(MIMEText(正文,“普通”))
打印(f“tot:{to}”)
打印(f“主题:{subject}”)
打印(f“正文:{body}”)
如果文件名不是“无”:
#以二进制模式打开PDF文件
以open(文件名“rb”)作为附件:
部分=MIMEBase(“应用程序”、“八位字节流”)
part.set_有效载荷(附件.read())
#用ASCII字符对文件进行编码以通过电子邮件发送
编码器。编码_base64(部分)
#将标题作为键/值对添加到附件部分
part.add_标题(
“内容处置”,
f“附件;文件名={filename}”,)
#将附件添加到邮件并将邮件转换为字符串
信息。附加(部分)
#发送电子邮件
打印(f“发送电子邮件…”)
self.session.sendmail(self.email、to、message.as_string())
如果名称=“\uuuuu main\uuuuuuuu”:
请求={
“电子邮件”:to@something.com",
“主题”:“来自python的新电子邮件”,
“身体”:“你好,我是机器人”,
}
电子邮件配置={
“服务器”:“smtp.orange.fr”,
“港口”:465,
“用户名”:”username@orange.fr",
“密码”:“我的密码”,
“电子邮件”:fromwhichemail@orange.fr",
}
m=邮件(电子邮件配置)
如果请求中有“pdf_文件”:
m、 发送消息(请求[“主题”]、请求[“电子邮件”]、请求[“正文”]、请求[“pdf文件”])
其他:
m、 发送消息(请求[“主题”]、请求[“电子邮件”]、请求[“正文”]、无)

这就是您的全部代码吗?剩下的部分在哪里(例如,您登录的部分)。ping smtp.gmail.com成功。但是问题仍然存在,如上所述。
telnet smtp.gmail.com 587
有效吗?可能是防火墙问题。对不起,问题仍然存在,如上所述。@Bryant:其他人已经问过了,但是你是否在脚本之外ping服务器?换句话说:您是否能够访问服务器?另外:您是否至少等待了40秒,以查看脚本将如何运行,以及在该行之后是否将执行任何操作?似乎问题不在这里,因为如果无法连接,这必须在30秒后超时。