python 3 smtplib异常:';SSL:错误的版本号';登录outlook

python 3 smtplib异常:';SSL:错误的版本号';登录outlook,python,outlook,openssl,imaplib,Python,Outlook,Openssl,Imaplib,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_') 最后一行

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)
回溯(最近一次呼叫最后一次):
文件“/usr/lib/python3.3/smtplib.py”,第366行,在getreply中
line=self.file.readline()
readinto中的文件“/usr/lib/python3.3/socket.py”,第297行
返回自我。将袜子重新放入(b)
文件“/usr/lib/python3.3/ssl.py”,第460行,在recv_中
返回自读(N字节,缓冲区)
文件“/usr/lib/python3.3/ssl.py”,第334行,已读
v=自身读取(len,缓冲区)
ssl.SSLError:[ssl:error\u VERSION\u NUMBER]error VERSION NUMBER(\u ssl.c:1504)
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/lib/python3.3/smtplib.py”,第621行,登录
身份验证\u平原+“”+编码\u平原(用户、密码))
docmd中的文件“/usr/lib/python3.3/smtplib.py”,第398行
返回self.getreply()
文件“/usr/lib/python3.3/smtplib.py”,第370行,在getreply中
+str(e))
smtplib.SMTPServerDisconnected:连接意外关闭:[SSL:错误的版本号]错误的版本号(\U SSL.c:1504)
我使用的SMTP信息(端口等)来自outlook的其他端口或域,我尝试使用这些端口或域时也会导致相同的错误

openssl版本的输出是
1.0.1e 2013年2月11日

来回答我自己的问题: 从Python3.3开始,您不必像中那样破解smtplib,而是可以在使用时传递一个对象

但是,请注意:如果登录数据错误,它仍然会引发错误。如果登录数据正确,则使用以下代码时一切正常:

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')

@user2884042的答案几乎是正确的

根据:

在版本3.5中更改:默认ssl_版本从协议_SSLv3更改为协议_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)

@camileg的可能副本。在某种程度上,解决方案更容易。Posted belowI尝试了此操作,但随后出现另一个错误:ValueError:必须指定certfile。有办法解决这个问题吗?