我试图通过质子桥从Python登录到我的质子邮件帐户。最初的项目是获得一个帐户的新消息计数。
当我尝试从内核运行它时:5.19.0-76051900-通用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)
有没有想过是什么导致了这个错误以及如何解决它?
短暂性脑缺血发作
#!/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()
看看上面的syxtax,我已经尝试过了。
2条答案
按热度按时间nfs0ujit1#
使用IMAP执行SSL的方法有两种:
从the documentation可以看出,质子桥使用第二个选项(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
一起使用,即类似于以下内容:trnvg8h32#
删除此
sslctx.options &= ~ssl.OP_NO_SSLv3
,ProtonMail不支持:参考文献将
ssl.OP_NO_TLSv1
和ssl.OP_NO_TLSv1_1
选项添加到SSLContext,以禁用对TLS 1.0和TLS 1.1的支持