摘要

  • JMAPACCESS 的核心承诺包括完整邮件集、可以推断足够的认证凭据,以及跨 IMAP/JMAP 一致的对象标识。
  • 对象相同不代表两次访问发生在同一时刻,也不代表可变状态、地址字段或用户动作完全一致。
  • 已核验勘误 8635 明确了示例中的命令名:请求入口使用 GETJMAPACCESS,不是 JMAPACCESS。

一次邮件迁移最容易被低估的成本,是让用户重新证明系统已经知道的事情。客户端明明已经登录、缓存了邮件,也知道用户选中了哪一封;换一个协议,却可能要求重新配置账号、重新登录、重新下载。新接口的效率还没有体现,切换成本先落到了用户身上。

RFC 9698 从现有 IMAP 会话内部搭了一座小桥。服务器可以告诉已经认证的客户端,同一批邮件还可以通过哪个 JMAP 会话入口访问。该文件于 2025 年 1 月发布,RFC Editor 将其列为 Proposed Standard。它支持渐进迁移,也允许 IMAP 客户端逐步采用 JMAP 扩展;它没有替运营者宣布迁移完成。

入口消息里装着什么

首先是覆盖范围。RFC 9698 只支持完整等价,即两个协议提供同一消息集合。两套接口属于同一家公司、显示几个相同文件夹,或者新接口暂时只接入收件箱,都不能替代这项具体承诺。

其次是本次认证的含义。服务器处理成功的 LOGIN 或 AUTHENTICATE,进入 Authenticated 状态后,要考虑客户端用了什么认证方式。能够由此推断其凭据足以用于 JMAP 时,后续发出的能力列表必须包含 JMAPACCESS。因此,判断单位不是“这台机器支持 JMAP”,而是“这个客户端沿这条认证路径,是否有足够的凭据进入对应 JMAP 服务”。

文件给出一个很现实的反例:为了照顾旧客户端,IMAP 暂时接受密码,而 JMAP 已经禁用密码。IMAP 登录可以成功,却没有 JMAPACCESS。看不到这个能力,不能直接推断 JMAP 服务不存在;看到了它,也不是已经收到下一次 JMAP 登录的成功响应。

最后是对象身份。一个 mailbox 或 message 在任一协议下具有某个 object ID,另一协议就应当让客户端通过相同 ID 访问同一个对象。服务器还必须宣告 RFC 8474 的 OBJECTID 扩展。这里说的不是把某个邮箱里的普通 UID 搬到另一个系统,便自动获得全局唯一性。

拿到地址以后,仍然要访问

客户端发送的是 GETJMAPACCESS。知道对应 JMAP 服务的 IMAP 服务器,先返回带有一个 Session URL 的未标记 JMAPACCESS 响应,再返回 tagged OK。不知道时应当返回 tagged BAD,也不应宣告该能力。

这处拼写并非吹毛求疵。勘误 8635 在 2025 年 11 月 21 日被核验,修正了示例二把命令误写成 JMAPACCESS 的问题。它改的是示例命令,不是发现了某家服务的漏洞,更没有重新设计认证。

地址指向 JMAP Session resource。RFC 8620 规定,成功的 authenticated GET 才会获得 Session 对象,说明给定凭据能够访问的账号与能力。入口地址、凭据推断、实际认证结果,是三个可以关联却不能合并的记录。扩展不签发新凭据,也不让客户端跳过后续认证。

RFC 9698 的安全论证同样有范围:客户端已持有有效凭据,而且既有 JMAP 服务发现也能够找到这个地址,因此作者认为新增披露的攻击收益有限。这不是对每一个生产端点、每一种凭据策略或传输配置的安全认证。本报道也没有做这些测试。

半秒钟足以让“同一封”消失

两个协议能找到同一对象,并不冻结对象。RFC 9698 明确指出,IMAP 读取后半秒再通过 JMAP 访问,邮件可能已经在中间被删除。第二次找不到它时,运维需要时间与删除证据,才能判断究竟是正常生命周期变化,还是原先的映射承诺出了问题。

状态也有自己的边界。规范鼓励尽量保持 flags 与其他数据一致,但 RFC 9698 本身不要求两个协议里的 mailbox 名称完全相同。不能因此说名字怎样不同都符合要求:JMAP Mail 的 RFC 8621 还规定了 name、role、邮件所属邮箱与关键词的规则。对账必须逐字段看合同,不能只比两个客户端的界面。

RFC 8474 的 EMAILID 指向不可变内容;共享 EMAILID 的实例仍可能有不同关键词。RFC 8620 的 record ID 唯一性也受账号和数据类型约束。因此,记录跨协议映射时应同时保存账号、对象类型和访问上下文,不能把裸字符串变成所有权、权限或状态一致性的证明。

国际化地址让这一点尤其直观。在 RFC 9698 描述的旧式 IMAP 条件下,尚未启用 UTF8=ACCEPT 的客户端可能取得降级字段,而 JMAP 返回准确地址。RFC 6855 解释了替代表示与原件的差别,包括回复和签名验证可能受到的影响。相同对象编号没有抹去表示差异;本条也不能泛化为所有 IMAP4rev2 会话都存在同样问题。

让小协议承担它能承担的责任

Lu Heng 的最低初始规范提供了阅读框架:共同层定义必要的不变量,运行选择仍由参与者承担。运行代码优先要求检验实际行为,现实层次则提醒读者,声明不能自动升级成已经执行的结果。这些是分析视角,不是 RFC 技术事实的替代来源。

据此,迁移至少有六个可区分的观察点:出现能力、取得会话地址、完成 JMAP 认证、匹配账号与对象、解释当前字段及状态、确认用户动作的结果。这是本文提出的运营方法,不是新增标准义务。资料没有证明任何指定供应商已经部署、某次切换造成事故,或迁移带来多少性能收益。JMAPACCESS 的价值在于让交接更容易开始;交接是否完成,仍须由运行系统回答。