python imaplib SSL质子桥

zvms9eto  于 2023-03-30  发布在  Python
关注(0)|答案(2)|浏览(143)

我试图通过质子桥从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,我已经尝试过了。

nfs0ujit

nfs0ujit1#

使用IMAP执行SSL的方法有两种:

  • TCP连接后立即升级到TLS
  • 在STARTTLS命令之后对普通TCP连接进行TLS升级

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.IMAP4starttls一起使用,即类似于以下内容:

imap = imaplib.IMAP4("localhost", 1143)
imap.starttls(ssl_context=sslctx)
trnvg8h3

trnvg8h32#

删除此sslctx.options &= ~ssl.OP_NO_SSLv3,ProtonMail不支持:参考文献
ssl.OP_NO_TLSv1ssl.OP_NO_TLSv1_1选项添加到SSLContext,以禁用对TLS 1.0和TLS 1.1的支持

相关问题