Hotmail SSL3 版本号错误使用 smtp
问题描述
我正在尝试使用 python 中的 hotmail smtp 服务器.但是,我的登录尝试引起了明显的 SSL3 版本号错误.如何更改我正在使用的版本以及如何对此进行调查?
I am trying to use the hotmail smtp server from python. However, my login attempt gives rise to an apparent SSL3 version number error. How can I change the version I am using and how do I even investigate this?
>> s.connect('smtp.live.com:587')
(220,
'BLU0-SMTP46.phx.gbl Microsoft ESMTP MAIL Service, Version: 6.0.3790.4675 ready at Tue, 2 Jul 2013 12:15:57 -0700')
>> s.ehlo()
(250,
'BLU0-SMTP46.phx.gbl Hello [123.456.789.01]
TURN
SIZE 41943040
ETRN
PIPELINING
DSN
ENHANCEDSTATUSCODES
8bitmime
BINARYMIME
CHUNKING
VRFY
TLS
STARTTLS
OK')
s.starttls()
(220, '2.0.0 SMTP server ready')
>> s.login('my.email@hotmail.com','MyPaSsW0rD')
---------------------------------------------------------------------------
SMTPServerDisconnected Traceback (most recent call last)
<ipython-input-48-c8e9d7577d8d> in <module>()
----> 1 s.login('mymemail@hotmail.com','myPassw0rd')
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/smtplib.pyc in login(self, user, password)
600 elif authmethod == AUTH_PLAIN:
601 (code, resp) = self.docmd("AUTH",
--> 602 AUTH_PLAIN + " " + encode_plain(user, password))
603 elif authmethod == AUTH_LOGIN:
604 (code, resp) = self.docmd("AUTH",
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/smtplib.pyc in docmd(self, cmd, args)
384 """Send a command, and return its response code."""
385 self.putcmd(cmd, args)
--> 386 return self.getreply()
387
388 # std smtp commands
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/smtplib.pyc in getreply(self)
357 self.close()
358 raise SMTPServerDisconnected("Connection unexpectedly closed: "
--> 359 + str(e))
360 if line == '':
361 self.close()
SMTPServerDisconnected: Connection unexpectedly closed: [Errno 1] _ssl.c:1363: error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number
我的 SSL 版本:
>> import _ssl
>> print _ssl.OPENSSL_VERSION
OpenSSL 1.0.1e 11 Feb 2013
也许这是相关的:Linux上的Python Smtp SSL错误版本
解决方案
我可以用 Python 2.7.3 复制 Debian Wheezy 的问题,它使用与您报告的完全相同的 OpenSSL 版本.我使用 Wireshark 捕获了数据包,并且成功进行了 TLS 握手并交换了一些数据.然而,不久之后,客户端对服务器发送的内容不满意并关闭了连接.
I can duplicate your problem with Debian Wheezy with Python 2.7.3 which uses the exact same OpenSSL version you report. I captured packets with Wireshark and there is a successful TLS handshake and some data is exchanged. Shortly after that however, the client end gets unhappy with something the server sends and closes the connection.
我能够通过使用 SSL3 而不是 TLS 来解决这个问题.我不知道如何在 Python 中修补库方法,以便使用它的其他库表现不同,所以我只制作了自己的 smtplib
本地副本.
I was able to work around the issue by using SSL3 instead of TLS. I couldn't figure out how to patch a library method in Python so that other libraries that used it would behave differently, so I just made my own local copy of smtplib
.
我复制了 2.7 版本的 smtplib
(点击原始链接下载)并更改了一行:
I copied the 2.7 version of smtplib
(click on the raw link to download) and changed one line:
self.sock = ssl.wrap_socket(self.sock, keyfile, certfile)
到
self.sock = ssl.wrap_socket(self.sock, keyfile, certfile, ssl_version=ssl.PROTOCOL_SSLv3)
然后在我的本地目录中编辑文件,我得到:
Then with the edited file in my local directory I get:
Python 2.7.3 (default, Jan 2 2013, 13:56:14)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import smtplib
>>> s = smtplib.SMTP()
>>> s.connect('smtp.live.com:587')
(220, 'BLU0-SMTP418.blu0.hotmail.com Microsoft ESMTP MAIL Service, Version: 6.0.3790.4675 ready at Wed, 3 Jul 2013 09:59:32 -0700')
>>> s.ehlo()
(250, 'BLU0-SMTP418.blu0.hotmail.com Hello [24.143.227.254]
TURN
SIZE 41943040
ETRN
PIPELINING
DSN
ENHANCEDSTATUSCODES
8bitmime
BINARYMIME
CHUNKING
VRFY
TLS
STARTTLS
OK')
>>> s.starttls()
(220, '2.0.0 SMTP server ready')
>>> s.ehlo()
(250, 'BLU0-SMTP418.blu0.hotmail.com Hello [24.143.227.254]
TURN
SIZE 41943040
ETRN
PIPELINING
DSN
ENHANCEDSTATUSCODES
8bitmime
BINARYMIME
CHUNKING
VRFY
AUTH LOGIN PLAIN
OK')
>>> s.login('my.email@hotmail.com','MyPaSsW0rD')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "smtplib.py", line 615, in login
raise SMTPAuthenticationError(code, resp)
smtplib.SMTPAuthenticationError: (535, '5.0.0 Authentication Failed')
>>>
我没有有效的 Hotmail 帐户,因此无法通过此处,但不再出现 SSL 错误.
I don't have a valid Hotmail account so I can't get past here, but there is no longer an SSL error.
相关文章