我需要为 imap 备份编写一个脚本,但是当我尝试使用脚本连接到 imap 服务器时,出现以下错误:
File "c:\Users\Lenovo\Desktop\python\progettoscuola.py", line 5, in <module>
imapSrc = imaplib.IMAP4_SSL('mail.safemail.it')
File "C:\Program Files\Python310\lib\imaplib.py", line 1323, in __init__
IMAP4.__init__(self, host, port, timeout)
File "C:\Program Files\Python310\lib\imaplib.py", line 202, in __init__
self.open(host, port, timeout)
File "C:\Program Files\Python310\lib\imaplib.py", line 1336, in open
IMAP4.open(self, host, port, timeout)
File "C:\Program Files\Python310\lib\imaplib.py", line 312, in open
self.sock = self._create_socket(timeout)
File "C:\Program Files\Python310\lib\imaplib.py", line 1327, in _create_socket
return self.ssl_context.wrap_socket(sock,
File "C:\Program Files\Python310\lib\ssl.py", line 512, in wrap_socket
return self.sslsocket_class._create(
File "C:\Program Files\Python310\lib\ssl.py", line 1070, in _create
self.do_handshake()
File "C:\Program Files\Python310\lib\ssl.py", line 1341, in do_handshake
self._sslobj.do_handshake()
ssl.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:997)```
Run Code Online (Sandbox Code Playgroud)
Ste*_*ich 17
Python 3.10 增加了 TLS 堆栈的默认安全设置,其中包括禁止任何仍然使用 RSA 密钥交换的密码。RSA 密钥交换长期以来被认为较差,因为它不提供前向保密,因此在 TLS 1.3 中也不再可用。所以总的来说Python 3.10的改变可以被认为是一种改进。
但是,一些服务器仍然需要这种过时的密钥交换,mail.safemail.it 似乎就是其中之一。现在,使用新强化的 TLS 设置连接到此类服务器将会失败,即使使用旧版本的 Python 可以成功连接。
要再次建立连接,必须使用较弱的安全设置。对于此特定服务器,可以通过回退到 OpenSSL 使用的默认密码来完成。以下代码将创建一个新的 SSL 上下文并使用它来连接到主机。这里重要的部分是使用较弱的设置ctx.set_ciphers('DEFAULT')。
import imaplib
import ssl
ctx = ssl.create_default_context()
ctx.set_ciphers('DEFAULT')
imapSrc = imaplib.IMAP4_SSL('mail.safemail.it', ssl_context = ctx)
Run Code Online (Sandbox Code Playgroud)