我试图通过质子桥从 python 登录到我的质子邮件帐户。 初始项目是获取帐户的新消息数。
当我尝试运行它时 内核:5.19.0-76051900-generic x86_64 位:64 编译器:N/A 桌面:Cinnamon 5.2.7 发行版:Pop!_OS 22.04 LTS 基础:Ubuntu 22.04 LTS Jammy
我收到一个错误消息
ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] 版本号错误 (_ssl.c:997)
关于导致错误的原因以及如何解决它的任何想法?
TIA
#!/usr/bin/python3
import imaplib
import ssl
usern="username"
passw="password"
bridge_certificate="cert.pem"
sslctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
sslctx.options &= ~ssl.OP_NO_SSLv3
sslctx.load_verify_locations(cafile=bridge_certificate)
sslctx.verify_mode = ssl.CERT_OPTIONAL
sslctx.check_hostname = False
count = 0
imap = imaplib.IMAP4_SSL("localhost", 1143, ssl_context=sslctx)
imap.login(usern, passw)
imap.select('INBOX')
status, response = imap.search(None, '(UNSEEN)')
if status == 'OK':
for num in response[0].split():
count=count+1
print(count)
imap.close()
imap.logout()
有关我尝试过的内容,请参阅上面的语法。
删除这个
sslctx.options &= ~ssl.OP_NO_SSLv3
ProtonMail 不支持它:Reference
将
ssl.OP_NO_TLSv1
和 ssl.OP_NO_TLSv1_1
选项添加到 SSLContext 以禁用对 TLS 1.0 和 TLS 1.1 的支持
有两种使用 IMAP 进行 SSL 的方法:
从文档可以看出,质子桥使用第二个选项(STARTTLS)。
但是
imaplib.IMAP4_SSL
使用第一个选项(TCP 连接后立即 TLS)。这意味着 Python 中的 SSL 堆栈在 TCP 连接后直接发送一个 TLS ClientHello,并期待返回一个 TLS ServerHello。但是-服务器端(质子桥)改为在连接时发送普通的 IMAP 欢迎消息,因为它仅在 STARTTLS 之后才需要 TLS。此 IMAP 欢迎消息随后会被误解为 TLS ServerHello,这会导致您看到 SSL: WRONG_VERSION_NUMBER
错误。
修复不是使用
imaplib.IMAP4_SSL
而是imaplib.IMAP4
和starttls
一起使用,即像这样的东西:
imap = imaplib.IMAP4("localhost", 1143)
imap.starttls(ssl_context=sslctx)