You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux环境下Python调用imaplib+Protonmail Bridge登录失败求助

问题:Protonmail Bridge 结合 Python imaplib 登录失败

问题背景

在Linux系统中使用Python的imaplib和ssl模块连接Protonmail Bridge时,初始用IMAP4_SSL出现SSL: WRONG_VERSION_NUMBER错误,按建议改用IMAP4配合starttls后,仍登录失败。

修改后代码

#!/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

imap = imaplib.IMAP4_SSL("localhost", 1143, ssl_context=sslctx)
imap = imaplib.IMAP4("localhost", 1143) 
print(imap.welcome) 
imap.starttls(ssl_context=sslctx) 
try: 
    imap.login(usern, passw) 
    print("Logged in as %r !" % usern) 
except: 
    imaplib.errno 
    print("Log in failed.") 

执行结果

  • 成功输出欢迎信息:b'* OK [CAPABILITY IDLE IMAP4rev1 MOVE STARTTLS UIDPLUS UNSELECT] Proton Mail Bridge 03.00.21 - gluon session ID 18'
  • 登录失败,报错:Log in failed. imaplib.IMAP4.error: command SELECT illegal in state NONAUTH, only allowed in states AUTH, SELECTED

错误原因分析

  1. 冗余代码无效:imap = imaplib.IMAP4_SSL(...)被后续的IMAP4实例覆盖,完全无意义,还可能占用连接资源。
  2. 启用废弃协议:sslctx.options &= ~ssl.OP_NO_SSLv3强制启用已淘汰的SSLv3协议,Protonmail Bridge不支持该协议,导致starttls加密握手失败。
  3. 异常处理不完善:except块仅打印通用提示,未捕获并输出具体错误,真实问题被掩盖,报错信息存在混淆。

解决方法

修正后的代码

#!/usr/bin/python3 
import imaplib
import ssl

usern="你的Protonmail用户名"
passw="你的Bridge授权密码"
bridge_certificate="~/.config/protonmail/bridge/cert.pem"  # Linux系统默认证书路径

# 配置SSL上下文,禁用SSLv3
sslctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
sslctx.load_verify_locations(cafile=bridge_certificate)
sslctx.verify_mode = ssl.CERT_OPTIONAL
sslctx.check_hostname = False

# 建立明文IMAP连接
imap = imaplib.IMAP4("localhost", 1143) 
print(imap.welcome) 

# 升级为TLS加密连接
imap.starttls(ssl_context=sslctx) 

try: 
    imap.login(usern, passw) 
    print(f"Logged in as {usern!r} !") 
    # 可选:登录后可执行邮箱操作,比如列出文件夹
    # imap.list()
except imaplib.IMAP4.error as e: 
    print(f"登录失败,错误信息:{e}") 
finally:
    # 确保关闭连接
    imap.logout()

关键修正点

  • 移除SSLv3配置:删除sslctx.options &= ~ssl.OP_NO_SSLv3,使用现代TLS协议完成加密握手。
  • 删除冗余代码:去掉无效的IMAP4_SSL实例创建语句。
  • 完善异常捕获:明确捕获imaplib.IMAP4.error并打印具体错误,便于精准排查。
  • 确认证书路径:Linux系统下Proton Bridge证书默认路径为~/.config/protonmail/bridge/cert.pem,需保证路径正确。
  • 使用授权密码:登录密码必须用Proton Bridge生成的应用授权密码,而非Protonmail账户的登录密码。

内容的提问来源于stack exchange,提问作者atammayata

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 18:24:55