RFC 6068《mailto URI 方案》中文导读

非官方中文导读声明:本页为 IETF RFC 6068《The 'mailto' URI Scheme》非官方中文技术导读,按原文章节顺序梳理规范要点,并非逐字全文翻译;任何规范性判断均以英文原文为准。英文原文见 rfc-editor.org/rfc/rfc6068.txt

1. mailto 是什么

当你在网页上点一个“联系我们”链接,浏览器打开邮件客户端并预填好收件人与主题——背后用的就是 mailto: URI。RFC 6068 规范了这个 URI 方案,定义了它如何表达收件人、抄送、主题、正文乃至附件提示。

它废止了 RFC 2368,是互联网邮件与 Web 互通的基础约定之一;其语义与 RFC 5321/5322 的地址与头字段相对应。

2. 语法结构

mailto URI 的整体结构非常紧凑,由“方案名 + 收件人 + 可选的查询头字段”组成:

mailtoURI = "mailto:" [ to ] [ hfields ]
to       = addr-spec *("," addr-spec)
hfields  = "?" header *( "&" header )

示例:mailto:bob@example.com?subject=Hello&body=Hi%20Bob 表示给 bob 发一封主题为 Hello、正文为 “Hi Bob” 的邮件。

3. 编码:UTF-8 百分比编码

mailto URI 中的非 ASCII 字符(包括国际化邮箱地址、中文主题与正文)必须按 UTF-8 编码后再做百分比编码(percent-encoding):每个字节表示为 %XX

这与 HTML 表单的 application/x-www-form-urlencoded 不同,必须明确区分。例如中文“你好”先转 UTF-8 字节,再每字节加 %。处理软件在解析时应先百分比解码、再按 UTF-8 解码,得到可读文本。

4. 伪头字段 subject 与 body

hfields 里有两个特殊的“伪头字段”(不是真正的邮件头,只是给邮件客户端预填用的):

其余如 ccin-reply-to 等是真实存在的头字段名,客户端应把它们映射到对应邮件头。注意问号、等号、与号本身在 URI 中有特殊含义,出现在值中时必须百分比编码。

5. 不安全的头字段被禁止

文档明确列出不得由 mailto 设置的“不安全头字段”,因为它们涉及邮件的来源、路由与时间,若可被链接任意设定,会被用于伪造与欺骗:

合规的邮件客户端应忽略 mailto 中对这些字段的设置,或至少向用户提示。反过来,允许设置 subjectbodyccin-reply-to 等无害字段,是 mailto 的可用价值所在。

6. 解析与渲染的健壮性

规范对处理方给出若干健壮性要求:遇到无法识别的头字段名时,应当忽略而非报错;遇到重复或不支持的参数时,按保守策略处理;对于 body 中的换行,需谨慎处理以免被注入额外头字段(头字段注入风险)。

对 Web 开发者而言,构造 mailto 时必须对所有动态内容做正确的百分比编码,并避免把用户输入不加转义地拼进 URI——这是 mailto 最常见的现实安全陷阱。

参考:https://www.rfc-editor.org/rfc/rfc6068.txt