[英]python 3 smtplib exception: 'SSL: WRONG_VERSION_NUMBER' logging in to outlook
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 信息(端口等)來自微軟幫助站點,我嘗試過的 Outlook 的其他端口或域導致了同樣的錯誤。
openssl version
的輸出是1.0.1e 11 Feb 2013
@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)
要回答我自己的問題:從 python 3.3 開始,您不必像本答案中那樣破解 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')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.