如今,“电子邮件正文”实际上是单个 MIME 部分的树。有时只有其中一个,例如text/plain
邮件。有时,multipart/alternative
其中包含消息的两个“等效”副本,一个 astext/plain
和另一个 as text/html
。有时结构要复杂得多,有很多层次的嵌套。很常见的是,其中一些部分实际上是二进制内容,例如图像、附加的 ZIP 文件等等。
这些单独的 MIME 部分中的每一个都可以进行编码以进行传输;这些在Content-Transfer-Encoding
相应 MIME 部分的标题中指定。您绝对必须支持互操作的两种编码方案是quoted-printable
和base64
。一个重要的观察结果是,这种编码对每个部分都是单独发生的,即,将 amultipart/alternative
与 atext/plain
编码为 withquoted-printable
和另一部分以 .text/html
编码是完全合法的base64
。
当您解码此传输编码后,您仍然必须将文本从其字符编码解码为 Unicode,即将字节流转换为 Unicode 文本。您需要查阅 MIME 标头的encoding
参数Content-Type
(同样,部分标头,而不是整个消息标头,除非消息本身只有一部分)。
您需要了解的所有详细信息都在 RFC 2045、RFC 2046、RFC 2047 和 RFC 2048(及其相应的更新)中。
最后,还有一个有趣的问题是电子邮件的“主要部分”是什么。假设你有这样的东西:
1个多部分/混合
+ 1.1 text/plain:“嗨,我正在转发 Jeff 的消息……”
+ 1.2 消息/rfc822
+ 1.2.1 多部分/替代
+ 1.2.1.1 text/plain “嗨,同事们,我正在从……发送会议记录”
+ 1.2.1.2 text/html "<p>各位同事,..."
即,这发生在 Fred 将 Jeff 的消息转发给您时。这里的“主要部分”是什么?