跳到主要内容

2. 消息的词法分析

2.1. 一般描述​

在最基本的层面上, 消息是一系列字符. 符合本规范的消息由取值在 1 到 127 范围内的字符组成, 并解释为 US-ASCII [ANSI.X3-4.1986] 字符. 为简洁起见, 本文档有时把这个字符范围简称为 "US-ASCII characters".

注意: 本文档规定消息由 US-ASCII 范围 1 到 127 内的字符组成. 还有其他文档, 特别是 MIME 文档系列 ([RFC2045], [RFC2046], [RFC2047], [RFC2049], [RFC4288], [RFC4289]), 扩展了本规范以允许该范围之外的取值. 这些机制的讨论不在本规范的范围内.

消息被划分为若干字符行. 一行是一系列以回车和换行两个字符分隔的字符; 也就是说, 回车 (CR) 字符 (ASCII 值 13) 后面紧跟换行 (LF) 字符 (ASCII 值 10). (本文档通常把这个回车/换行对写作 "CRLF".) 消息由头部字段组成 (统称为"消息的头部段"), 其后可选地跟随正文. 头部段是一系列具有本规范所定义特殊语法的字符行. 正文只是跟随在头部段之后的一串字符, 并通过一个空行与头部段分隔 (即该行在 CRLF 之前没有任何内容).

注意: 通常的说法以及本规范的早期版本使用 "header" 一词来指整个头部段, 或指单个头部字段. 为避免歧义, 本文档不单独使用 "header" 或 "headers", 而是始终使用 "header field" 指单个字段, 并使用 "header section" 指整个集合.

2.1.1. 行长度限制​

本规范对一行中的字符数施加了两种限制. 每行字符必须不超过 998 个字符, 并且应当不超过 78 个字符, 不包括 CRLF.

998 个字符的限制源于许多发送、接收或存储 IMF 消息的实现的局限, 这些实现根本无法处理一行中超过 998 个字符的情况. 出于健壮性考虑, 接收实现最好能够处理一行中任意多的字符. 然而, 有太多实现 (为了遵守 [RFC5321] 的传输要求) 不接受每行在包含 CR 和 LF 的情况下超过 1000 个字符的消息, 因此实现不要创建此类消息很重要.

更保守的 78 字符建议是为了适应许多显示这些消息的用户界面实现, 它们可能会截断每行超过 78 个字符的显示, 或者以灾难性的方式折行, 尽管此类实现并不符合本规范的意图 (如果它们实际造成信息丢失, 也不符合 [RFC5321] 的意图). 再次说明, 尽管这个限制是施加在消息上的, 但显示消息的实现出于健壮性考虑, 有责任处理一行中任意多的字符 (当然至少要达到 998 字符的限制).

2.2. 头部字段​

头部字段是以字段名开头、后跟冒号 (":")、再后跟字段主体, 并以 CRLF 结尾的行. 字段名必须由可打印的 US-ASCII 字符组成 (即取值在 33 到 126 之间 (含端点) 的字符), 但冒号除外. 字段主体可以由可打印的 US-ASCII 字符以及空格 (SP, ASCII 值 32) 和水平制表符 (HTAB, ASCII 值 9) 字符组成 (这些字符合称为空白字符, WSP). 字段主体不得包含 CR 和 LF, 除非它们用于第 2.2.3 节所述的 "folding" (折叠) 和 "unfolding" (展开). 所有字段主体都必须符合本规范第 3 节和第 4 节所述的语法.

2.2.1. 非结构化头部字段主体​

本规范中的某些字段主体被简单地定义为 "unstructured" (非结构化) (第 3.2.5 节规定其为任意可打印 US-ASCII 字符加上空白字符), 没有进一步的限制. 这些称为非结构化字段主体. 从语义上看, 非结构化字段主体只需被当作单行字符处理, 不做进一步处理 (第 2.2.3 节所述的 "folding" 和 "unfolding" 除外).

2.2.2. 结构化头部字段主体​

本规范中的某些字段主体具有比上述非结构化字段主体更严格的语法. 这些称为 "structured" (结构化) 字段主体. 结构化字段主体是本规范第 3 节和第 4 节所述特定词法记号的序列. 按照其语法, 其中许多记号允许以注释 (第 3.2.2 节所述) 以及空白字符开头或结尾, 而这些空白字符要受第 2.2.3 节所述 "folding" 和 "unfolding" 的约束. 结构化字段主体的语义分析与其语法一起给出.

2.2.3. 长头部字段​

每个头部字段在逻辑上都是由字段名、冒号和字段主体组成的单行字符. 但为方便起见, 并为处理每行 998/78 字符的限制, 头部字段的字段主体部分可以拆分为多行表示; 这称为 "folding" (折叠). 一般规则是: 凡是本规范允许出现折叠空白 (而不只是 WSP 字符) 的地方, 都可以在任意 WSP 之前插入一个 CRLF.

例如, 头部字段:

Subject: This is a test

可以表示为:

Subject: This is a test

注意: 尽管结构化字段主体的定义方式允许在许多词法记号之间 (甚至在某些词法记号内部) 进行折叠, 但折叠应当限制在较高层级的语法间断处放置 CRLF. 例如, 如果字段主体定义为逗号分隔的取值, 那么推荐在分隔结构化项的逗号之后折叠, 而不是在字段可以折叠的其他位置折叠, 即使其他位置也允许折叠.

从头部字段的这种折叠多行表示转换到其单行表示的过程称为 "unfolding" (展开). 展开的方法是简单地删除任何后面紧跟 WSP 的 CRLF. 每个头部字段都应当以其展开后的形式进行后续的语法和语义评估. 展开后的头部字段没有长度限制, 因而可能无限长.

2.3. 正文​

消息正文只是若干 US-ASCII 字符行. 正文只有以下两个限制:

o CR 和 LF 必须只作为 CRLF 一起出现; 它们不得在正文中单独出现. o 正文中的字符行必须限制为 998 个字符, 并且应当限制为 78 个字符, 不包括 CRLF.

注意: 如前所述, 还有其他文档, 特别是 MIME 文档 ([RFC2045], [RFC2046], [RFC2049], [RFC4288], [RFC4289]), 扩展 (并限制) 了本规范, 以允许不同类型的消息正文. 再次说明, 这些机制超出本文档的范围.