摘要

  • LANGUAGE 改变固定的人类可读响应,并可为 NAMESPACE 前缀提供本地化呈现;显示文字不是邮箱改名,也没有获得命名权。
  • 活动比较器决定部分 SEARCH、SORT 与 THREAD 的匹配和次序;要重建结果,必须保留解码、字符集转换、比较器、回退路径与安全层代际。

一个“语言”选项背后有两种权力

在邮件客户端里,语言通常是设置页上的一个下拉框。它很容易让产品团队相信,选择中文以后,提示文字、文件夹名称和搜索语义都会整齐地进入同一个本地化状态。RFC 5255 没有把这些能力捆在一起。

LANGUAGE 扩展控制服务器如何表达人类可读响应,并可附带命名空间前缀的翻译。I18NLEVEL 扩展控制某些文本如何被比较,从而影响搜索、排序和会话串。服务器可以分别宣告和实现它们,因为呈现与匹配是两个独立控制面。

若运营记录只写“locale=zh”,事后便无法判断发生了什么:也许只有错误提示变成中文;也许共享邮箱的前缀只是换了显示词;也许搜索启用了不同的 Unicode 比较器;也许语言学比较失败,系统最终按原始字节匹配。

翻译后的前缀必须能回到规范名称

RFC 5255 对 LANGUAGE 的权限划得很窄。它只改变固定服务器字符串,例如响应文本和 NAMESPACE 文件夹前缀。为共享邮箱分配本地化别名被明确留给另一种机制。换句话说,翻译文字没有取得邮箱身份。

NAMESPACE 的 TRANSLATION 返回规范前缀的一种本地化表示。客户端负责在规范前缀与翻译表示之间转换,再把邮箱名称呈现给用户。这个映射必须可逆,不能只保存其中好看的一端。

如果客户端把“其他用户”之类的显示文字当作真正的前缀,切换语言可能看起来像邮箱被新建、删除或移动。收藏夹、缓存、权限界面、迁移工具和审计日志也可能继承错误身份。可靠记录应绑定规范前缀、显示文字、语言标签、服务器与会话代际。

LANGUAGE 响应本身也不能被压成“成功选择”。只含一个语言标签时,它表示新的活动语言;包含多个标签时,它只是列举可用语言,不改变当前选择;请求失败时,先前语言继续有效。用户点过哪个按钮不是权威证据,服务器响应才定义状态转换。

default 同样不是恒定身份。它请求服务器管理员偏好的语言,而且偏好可以随当前用户变化。这是呈现策略的输出,不是邮箱属性,更不是对人的语言身份声明。

安全层把同一偏好分成两个代际

LANGUAGE 在认证前就可使用,因为用户可能需要读懂“密码已过期”或 STARTTLS 失败之类信息。实用性也意味着第一次选择可能发生在尚未受保护的通道上。

主动攻击者可以压制或修改认证前的语言协商,使后续安全错误更难理解。因此,RFC 5255 要求在 TLS 或 SASL 安全层启用以后重新发送 LANGUAGE。

第二次命令不是界面刷新,而是新的授权代际。记录应说明选择发生在安全层之前还是之后,哪种保护已经生效,服务器返回了什么,以及从哪一条响应开始使用新语言。否则,应用会把未受保护阶段的选择无声继承到受保护阶段。

重新协商也不会使自然语言提示变成认证事实。它不能证明服务器身份、凭证有效或授权成功。机器可读状态码、人类可读解释与受保护通道仍然是三张不同的回执。

比较器是查询的可执行组成部分

RFC 5255 把没有显式协商时使用的规则称为默认比较器,把会话当前使用的规则称为活动比较器。I18NLEVEL=1 要求 i;unicode-casemap;I18NLEVEL=2 增加查询和选择比较器的 COMPARATOR 命令。

比较器并非查询旁边的描述信息。它直接参与查询含义。活动比较器作用于主题、正文、发件人、收件人和头字段等指定 SEARCH 键,也作用于相关 SORT 键以及 THREAD 的主题比较。但它不会全局重写邮件库中的字符串。

连接进入认证状态后,服务器的默认比较器必须在该连接剩余时间内保持不变。这给隐式查询建立了稳定基线。客户端仍可以显式改变活动比较器,所以审计必须同时保留默认值、COMPARATOR 请求与服务器最终选择。

操作能力也是边界。SEARCH 需要子串操作;SORT 需要排序,而排序又依赖相等关系。若活动比较器不提供命令所需的操作,服务器应当拒绝命令,而不是悄悄换一套近似规则。选择比较器成功,不等于所有后续命令都能使用它。

比较发生前,文本已经经历处理链

邮件中的文字不会原封不动地送进比较器。服务器先去除 MIME 传输或头部编码,再把解码结果转换为比较器所需字符集。每一步都可能失败,而且部分 MIME 解码失败由实现自行处理。

对于子串搜索,字符集转换失败会使系统用 i;octet 比较解码后的原始表示;比较器返回未定义结果时,也可能进入相同回退。对于排序,成功转换且有效的字符串使用活动比较器,失败或无效字符串单独成组,用 i;octet 排序并放在有效组之后。

最终列表表面上只有一个次序,实际可能由两套规则拼成。一条搜索结果可能来自字节相同,而不是语言学意义相同;排在末尾的一组邮件可能表示转换失败,而不是语义优先级更低。

因此,查询回执必须保存邮件或字段代际、声明字符集、MIME 解码结果、转换结果、请求与选中的比较器、所需操作、回退比较器以及确切成员和顺序。仅保存用户输入的关键词,无法重放这次决定。

邮件不变,答案仍可能变化

两个服务器可以保存相同内容,却支持不同字符集、比较器或错误处理。一台服务器升级 Unicode 或 MIME 库以后,即使没有邮件被编辑,也可能给出不同结果。

这不是任意行为的许可,而是版本化机制的要求。面对“那封邮件搜不到了”,运营人员应能区分邮件不存在、字段不在查询范围、MIME 解码失败、字符集转换失败、比较器不可用、结果未定义以及意外字节回退。

IANA 当前 IMAP 能力注册表仍列出 LANGUAGE、I18NLEVEL=1 与 I18NLEVEL=2,并把它们指向 RFC 5255。注册表证明能力名称和规范来源,不证明某一部署实现了能力,更不证明不同服务器使用同一版本的比较算法。

后续标准进一步说明了身份边界。RFC 6855 为用户名、邮件地址、邮件头和邮箱名称处理增加 UTF-8;RFC 9051 替代 IMAP4rev1。它们涉及的标识符和内容权限,超出了 RFC 5255 的固定响应本地化。

同一种文字脚本可以同时出现在翻译标签、规范名称、归一化搜索词和存储内容里,但它们的权威来源不同。Lu Heng 的现实层方法给出领导原则:呈现、身份、查询结果和安全通道都是真实的,却不能互相认证。显示必须能返回规范名,结果必须能返回产生它的比较规则代际。

来源