Python 2:SMTPServerDisconnected:连接意外关闭
Posted
技术标签:
【中文标题】Python 2:SMTPServerDisconnected:连接意外关闭【英文标题】:Python 2: SMTPServerDisconnected: Connection unexpectedly closed 【发布时间】:2013-07-19 13:14:54 【问题描述】:我在用 Python 发送电子邮件时遇到了一个小问题:
#me == my email address
#you == recipient's email address
me = "some.email@gmail.com"
you = "some_email2@gmail.com"
# Create message container - the correct MIME type is multipart/alternative.
msg = MIMEMultipart('alternative')
msg['Subject'] = "Alert"
msg['From'] = me
msg['To'] = you
# Create the body of the message (a plain-text and an html version).
html = '<html><body><p>Hi, I have the following alerts for you!</p></body></html>'
# Record the MIME types of both parts - text/plain and text/html.
part2 = MIMEText(html, 'html')
# Attach parts into message container.
# According to RFC 2046, the last part of a multipart message, in this case
# the HTML message, is best and preferred.
msg.attach(part2)
# Send the message via local SMTP server.
s = smtplib.SMTP('aspmx.l.google.com')
# sendmail function takes 3 arguments: sender's address, recipient's address
# and message to send - here it is sent as one string.
s.sendmail(me, you, msg.as_string())
s.quit()
所以在此之前,我的程序没有给我一个错误,但它也没有给我发送电子邮件。现在python给了我一个错误:
SMTPServerDisconnected: Connection unexpectedly closed
我该如何解决这个问题?
【问题讨论】:
你检查你的互联网连接了吗? 嘿,看看这个问题:-***.com/questions/6270782/sending-email-with-python Issue with sending mails from a distribution mail id [Python]的可能重复 我认为问题出在本地 SMTP 服务器上 有人知道任何其他公共 SMTP 服务器吗? 【参考方案1】:TLDR:切换到经过身份验证的 TLS 连接。
很可能gmail服务器在数据命令之后拒绝了连接(在这个阶段他们这样做非常讨厌:)。实际消息很可能是这个:
retcode (421); Msg: 4.7.0 [ip.octets.listed.here 15] Our system has detected an unusual rate of
4.7.0 unsolicited mail originating from your IP address. To protect our
4.7.0 users from spam, mail sent from your IP address has been temporarily
4.7.0 rate limited. Please visit
4.7.0 https://support.google.com/mail/answer/81126 to review our Bulk Email
4.7.0 Senders Guidelines. qa9si9093954wjc.138 - gsmtp
我怎么知道?因为我已经尝试过 :) 使用 s.set_debuglevel(1)
,它会打印 SMTP 对话,您可以直接看到问题所在。
这里有两个选择:
继续使用该继电器; as explained by Google,它只是未加密的 gmail-to-gmail,您必须通过他们的程序将您的 ip 列入黑名单
最简单的选择是切换到带有身份验证的 TLS
更改后的源如下所示:
# skipped your comments for readability
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
me = "some.email@gmail.com"
my_password = r"your_actual_password"
you = "some.email2@gmail.com"
msg = MIMEMultipart('alternative')
msg['Subject'] = "Alert"
msg['From'] = me
msg['To'] = you
html = '<html><body><p>Hi, I have the following alerts for you!</p></body></html>'
part2 = MIMEText(html, 'html')
msg.attach(part2)
# Send the message via gmail's regular server, over SSL - passwords are being sent, afterall
s = smtplib.SMTP_SSL('smtp.gmail.com')
# uncomment if interested in the actual smtp conversation
# s.set_debuglevel(1)
# do the smtp auth; sends ehlo if it hasn't been sent already
s.login(me, my_password)
s.sendmail(me, you, msg.as_string())
s.quit()
现在,如果尝试“欺骗”系统并使用不同的(非 gmail)地址发送,它会 a) 要求您连接到不同的主机名(gmail 的一些 MX 记录),然后 b) 停止您并以列入黑名单的 IP 为由关闭连接,并且 c) 执行反向 DNS、DKIM 和许多其他对策,以确保您实际上控制了您在 MAIL FROM: 地址中提供的域。
最后,还有选项 3) - 使用任何其他电子邮件中继服务,有很多不错的服务 :)
【讨论】:
【参考方案2】:我遇到了同样的问题,只是通过像这样指定正确的端口来解决它:
smtplib.SMTP('smtp.gmail.com', 587)
【讨论】:
【参考方案3】:使用smtplib.SMTP_SSL()
代替smtplib.SMTP()
对我有用。试试这个。
【讨论】:
【参考方案4】:我发现了一个奇怪的行为。我使用了提到问题和答案的类似代码。我的代码最近几天一直在工作。但是,今天我遇到了问题中提到的错误信息。
我的解决方案: 我曾通过图书馆网络尝试过我的成功尝试。今天我通过星巴克网络(通过强制门户)尝试了它。我将其更改为我的移动网络。它又开始工作了。
Google 可能会拒绝来自不可靠网络的请求。
【讨论】:
【参考方案5】:我也遇到了同样的问题。就我而言,几天前就更改了密码。所以,它给出了错误。当我在代码中更新密码时,它就像一个魅力......!!!
【讨论】:
【参考方案6】:Google 员工:我有一个在本地运行的测试 smtp 服务器。我收到此错误是因为我在关闭客户端 smtp 之前关闭了本地 smtp 服务器。
【讨论】:
您认为这就是问题所在,还是您添加它只是因为它具有相同的错误消息。如果只是因为错误消息相同,最好添加一个新问题并将其作为新问题的答案。 为什么不对以上所有答案提出相同的问题? 因为审核队列一次只显示一个供审核的答案。向其他人询问同样的问题可能是公平的,如果您愿意,您可以标记他们以供审核。 这是有道理的。我认为这可能是对上述问题的回答,没有一个被接受。我将答案部分视为对具有相同错误消息的未来用户的帮助,不仅是提问的人,尤其是当答案未被接受时。 措辞新问题的好处是,如果有人搜索错误消息和几个关键字,则更有可能找到它。基本上是错误消息的问题的问题在于,如果错误消息是通用的,那么您最终可能会在其下方得到大量不相关的答案,这些答案都可能是更具体问题的好答案。以上是关于Python 2:SMTPServerDisconnected:连接意外关闭的主要内容,如果未能解决你的问题,请参考以下文章
将Python 2转换为Python 3(使用Python 2样式执行)