2013-07-02 4 views
2

python에서 hotmail smtp 서버를 사용하려고합니다. 그러나 로그인 시도가 명백한 SSL3 버전 번호 오류를 발생시킵니다. 내가 사용하고있는 버전을 어떻게 바꿀 수 있으며 어떻게 조사 할 수 있습니까? smtp를 사용하는 Hotmail 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.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('[email protected]','MyPaSsW0rD') 
--------------------------------------------------------------------------- 
SMTPServerDisconnected     Traceback (most recent call last) 
<ipython-input-48-c8e9d7577d8d> in <module>() 
----> 1 s.login('[email protected]','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 

: 당신이보고 동일한에서 OpenSSL 버전을 사용 나는 파이썬 2.7.3와 데비안 위지와 함께 문제를 복제 할 수 있습니다

+0

나는'starttls()'다음에'ehlo()'를 다시해야한다고 생각한다. 또한'_ssl'과'print _ssl.OPENSSL_VERSION'을 import한다면 무엇을 얻게 될까요? – rhashimoto

+0

@rhashimoto, 나는 또 다른 ehlo를 추가했다. 그리고 그것은 나에게 같은 오류를 주었다. SSL 버전 정보를 추가했습니다. – highBandWidth

+0

Django의 기본 EmailBackend를 사용하여 동일한 문제가 발생했습니다 (당연히 smtplib에 의존합니다). 그래서 나는이 문제에 부딪 치는 다른 사람들에게 유용 할 수있는 맞춤형 EmailBackend (rhashimoto의 답을 바탕으로)를 작성했습니다! https://github.com/cybercase/django-smtp-starttls – cybercase

답변

2

Python Smtp SSL wrong version on linux . Wireshark를 사용하여 패킷을 캡처했으며 성공적인 TLS 핸드 셰이크가 있고 일부 데이터가 교환됩니다. 그 직후에 클라이언트 측은 서버가 보내고 연결을 끊는 것에 불만을 갖습니다.

TLS 대신 SSL3을 사용하여이 문제를 해결할 수있었습니다. 파이썬에서 라이브러리 메소드를 패치하는 방법을 알아낼 수 없기 때문에 다른 라이브러리가 사용하는 방식이 다르기 때문에 smtplib이라는 로컬 복사본을 만들었습니다.

은 내가 2.7 version of smtplib이 (다운로드 raw link 클릭) 복사 한 줄 변경 :

 self.sock = ssl.wrap_socket(self.sock, keyfile, certfile) 

내가 얻을 내 로컬 디렉토리에 편집 된 파일을 다음

 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('[email protected]','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 오류가 없습니다.