python 3 smtplib 异常:“SSL:WRONG_VERSION_NUMBER”登录到 Outlook
Posted
技术标签:
【中文标题】python 3 smtplib 异常:“SSL:WRONG_VERSION_NUMBER”登录到 Outlook【英文标题】:python 3 smtplib exception: 'SSL: WRONG_VERSION_NUMBER' logging in to outlook 【发布时间】:2013-10-23 18:59:30 【问题描述】:以下python 3中的代码在我的电脑上引发错误,我不知道如何正确登录:
import smtplib
connection = smtplib.SMTP('smtp-mail.outlook.com', 587)
connection.ehlo()
connection.starttls()
connection.ehlo()
connection.login('_these_dont_matter@outlook.com', '_the_error_persists_')
最后一行产生以下输出:
Traceback (most recent call last):
File "/usr/lib/python3.3/smtplib.py", line 366, in getreply
line = self.file.readline()
File "/usr/lib/python3.3/socket.py", line 297, in readinto
return self._sock.recv_into(b)
File "/usr/lib/python3.3/ssl.py", line 460, in recv_into
return self.read(nbytes, buffer)
File "/usr/lib/python3.3/ssl.py", line 334, in read
v = self._sslobj.read(len, buffer)
ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1504)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.3/smtplib.py", line 621, in login
AUTH_PLAIN + " " + encode_plain(user, password))
File "/usr/lib/python3.3/smtplib.py", line 398, in docmd
return self.getreply()
File "/usr/lib/python3.3/smtplib.py", line 370, in getreply
+ str(e))
smtplib.SMTPServerDisconnected: Connection unexpectedly closed: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1504)
我使用的 SMTP 信息(端口等)来自 a microsoft help site,我尝试过的 Outlook 的其他端口或域也会导致相同的错误。
openssl version
的输出是1.0.1e 11 Feb 2013
【问题讨论】:
Hotmail SSL3 version number error using smtp的可能重复 @CamilleG。有点,解决方案更容易。发布在下面 【参考方案1】:@user2884042 的答案几乎是对的。
根据https://docs.python.org/3/library/ssl.html:
在 3.5 版中更改:默认 ssl_version 从 PROTOCOL_SSLv3 更改为 PROTOCOL_TLS 以最大限度地兼容现代服务器。
因此,您需要将“PROTOCOL_SSLv3”替换为“PROTOCOL_TLS”,这样代码就会变成:
import smtplib
import ssl
context = ssl.SSLContext(ssl.PROTOCOL_TLS)
connection = smtplib.SMTP('smtp-mail.outlook.com', 587)
connection.ehlo()
connection.starttls(context=context)
connection.ehlo()
connection.login('now_your_real_login_data@outlook.com', 'otherwise_SMTPServerDisconnect')
有时您甚至不需要登录。而不是以下行,
$ connection.login('now_your_real_login_data@outlook.com', 'otherwise_SMTPServerDisconnect')
您可以使用您的凭据直接发送电子邮件。
$ sender_email = "senderemail@example.com"
$ receiver_email = "receiveremail@example.com"
$ msg = "Hello from python!"
$ connection.sendmail(sender_email, receiver_email, msg)
【讨论】:
【参考方案2】:回答我自己的问题:
从 python 3.3 开始,您不必像 this answer 那样破解 smtplib,而是可以在使用 starttls
时传递一个 SSLContext
对象。
但是,请注意:如果登录数据错误,它仍然会引发错误。如果登录数据正确,则使用以下代码一切正常:
import smtplib
import ssl
context = ssl.SSLContext(ssl.PROTOCOL_SSLv3)
connection = smtplib.SMTP('smtp-mail.outlook.com', 587)
connection.ehlo()
connection.starttls(context=context)
connection.ehlo()
connection.login('now_your_real_login_data@outlook.com', 'otherwise_SMTPServerDisconnect')
【讨论】:
我试过这个,但是我得到另一个错误:ValueError: certfile must be specified。有什么办法解决吗?以上是关于python 3 smtplib 异常:“SSL:WRONG_VERSION_NUMBER”登录到 Outlook的主要内容,如果未能解决你的问题,请参考以下文章