python imaplib ssl质子桥

问题描述 投票:0回答:2

我试图通过质子桥从 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()

有关我尝试过的内容,请参阅上面的语法。

python ssl imaplib
2个回答
0
投票

删除这个

sslctx.options &= ~ssl.OP_NO_SSLv3
ProtonMail 不支持它:Reference

ssl.OP_NO_TLSv1
ssl.OP_NO_TLSv1_1
选项添加到 SSLContext 以禁用对 TLS 1.0 和 TLS 1.1

的支持

0
投票

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

  • TCP 连接后直接升级到 TLS
  • STARTTLS 命令后普通 TCP 连接的 TLS 升级

文档可以看出,质子桥使用第二个选项(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)
© www.soinside.com 2019 - 2024. All rights reserved.