Python 使用smtp时Hotmail SSL3版本号错误
我正在尝试使用python中的hotmail smtp服务器。但是,我的登录尝试会导致明显的SSL3版本号错误。我如何才能更改我正在使用的版本,我甚至如何对此进行调查Python 使用smtp时Hotmail SSL3版本号错误,python,ssl,smtp,hotmail,smtplib,Python,Ssl,Smtp,Hotmail,Smtplib,我正在尝试使用python中的hotmail smtp服务器。但是,我的登录尝试会导致明显的SSL3版本号错误。我如何才能更改我正在使用的版本,我甚至如何对此进行调查 >> 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.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]\nTURN\nSIZE 41943040\nETRN\nPIPELINING\nDSN\nENHANCEDSTATUSCODES\n8bitmime\nBINARYMIME\nCHUNKING\nVRFY\nTLS\nSTARTTLS\nOK')
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
也许这是相关的:我可以用Python 2.7.3复制您的Debian Wheezy问题,它使用与您报告的完全相同的OpenSSL版本。我用Wireshark捕获了数据包,成功地进行了TLS握手,并交换了一些数据。然而,不久之后,客户端对服务器发送的内容感到不满意,并关闭了连接 我能够通过使用SSL3而不是TLS来解决这个问题。我不知道如何在Python中修补一个库方法,以便其他使用它的库的行为会有所不同,所以我只是制作了自己的
smtplib
本地副本
我复制了(单击下载)并更改了一行:
self.sock = ssl.wrap_socket(self.sock, keyfile, certfile)
到
然后,通过本地目录中的编辑文件,我得到:
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]\nTURN\nSIZE 41943040\nETRN\nPIPELINING\nDSN\nENHANCEDSTATUSCODES\n8bitmime\nBINARYMIME\nCHUNKING\nVRFY\nTLS\nSTARTTLS\nOK')
>>> s.starttls()
(220, '2.0.0 SMTP server ready')
>>> s.ehlo()
(250, 'BLU0-SMTP418.blu0.hotmail.com Hello [24.143.227.254]\nTURN\nSIZE 41943040\nETRN\nPIPELINING\nDSN\nENHANCEDSTATUSCODES\n8bitmime\nBINARYMIME\nCHUNKING\nVRFY\nAUTH LOGIN PLAIN\nOK')
>>> 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')
>>>
Python 2.7.3(默认,2013年1月2日13:56:14)
[GCC 4.7.2]关于linux2
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>导入smtplib
>>>s=smtplib.SMTP()
>>>s.connect('smtp.live.com:587')
(220,'BLU0-SMTP418.BLU0.hotmail.com Microsoft ESMTP邮件服务,版本:6.0.3790.4675于2013年7月3日星期三09:59:32-0700'准备就绪)
>>>s.ehlo()
(250,'BLU0-SMTP418.BLU0.hotmail.com您好[24.143.227.254]\nTURN\nSIZE 41943040\nETRN\npipeling\nDSN\nENHANCEDSTATUSCODES\n8bitmime\nbinaryime\nCHUNKING\nVRFY\nTLS\nSTARTTLS\nOK')
>>>s.starttls()
(220,“2.0.0 SMTP服务器就绪”)
>>>s.ehlo()
(250,'BLU0-SMTP418.BLU0.hotmail.com您好[24.143.227.254]\nTURN\nSIZE 41943040\nETRN\npipeling\nDSN\nENHANCEDSTATUSCODES\n8bitmime\nbinaryime\nCHUNKING\nVRFY\nAUTH普通登录\nOK')
>>>我的。email@hotmail.com“,”MyPaSsW0rD')
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
登录中第615行的文件“smtplib.py”
引发SMTPAuthenticationError(代码,resp)
smtplib.SMTPAuthenticationError:(535,“5.0.0身份验证失败”)
>>>
我没有有效的Hotmail帐户,因此无法通过此处,但不再存在SSL错误。我认为您应该在
starttls()
之后再次使用ehlo()
。另外,如果您import\u ssl
和print\u ssl.OPENSSL\u VERSION
,您会得到什么?@rhashimoto,我添加了另一个ehlo,它给了我相同的错误。我已经添加了SSL版本信息。我在使用Django的默认EmailBackend时遇到了相同的问题(当然,它依赖于smtplib)。所以我写了一个定制的EmailBackend(基于rhashimoto的答案),它可能对遇到这个问题的其他人有用!
self.sock = ssl.wrap_socket(self.sock, keyfile, certfile, ssl_version=ssl.PROTOCOL_SSLv3)
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]\nTURN\nSIZE 41943040\nETRN\nPIPELINING\nDSN\nENHANCEDSTATUSCODES\n8bitmime\nBINARYMIME\nCHUNKING\nVRFY\nTLS\nSTARTTLS\nOK')
>>> s.starttls()
(220, '2.0.0 SMTP server ready')
>>> s.ehlo()
(250, 'BLU0-SMTP418.blu0.hotmail.com Hello [24.143.227.254]\nTURN\nSIZE 41943040\nETRN\nPIPELINING\nDSN\nENHANCEDSTATUSCODES\n8bitmime\nBINARYMIME\nCHUNKING\nVRFY\nAUTH LOGIN PLAIN\nOK')
>>> 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')
>>>