内容传输编码7位或8位

时间:2014-09-07 13:17:47

标签: email encoding header transfer

在发送电子邮件内容时,需要设置内容转移编码"头。我观察到了很多收到的电子邮件标题。一些电子邮件使用" 7bit"有些人正在使用" 8bit"。

这两者有什么区别?推荐哪个?电子邮件正文是否需要特殊编码才能设置这些标题?

2 个答案:

答案 0 :(得分:217)

阅读可能有点密集,但内容传输编码"内容传输编码" RFC 1341的部分包含所有细节:

http://www.w3.org/Protocols/rfc1341/5_Content-Transfer-Encoding.html

情况变得越来越糟。这是我的总结:

背景

根据定义(RFC 821),SMTP将邮件限制为每行7位的1000个字符的行。这意味着您向管道发送的所有字节都不能将最重要的("最高位")位设置为" 1"。

我们想要发送的内容通常不会遵守此限制。想象一下图像文件或包含Unicode字符的文本文件:这些文件的字节通常将其第8位设置为" 1"。 SMTP不允许这样做,所以你需要使用"传输编码"描述你如何解决不匹配问题。

Content-Transfer-Encoding标题的值描述了您为解决此问题而选择的规则。

7Bit编码

7bit只是意味着"我的数据只包含US-ASCII字符,每个字符只使用低7位。"您基本上保证内容中的所有字节都符合SMTP的限制,因此无需特殊处理。你可以按原样阅读。

请注意,当您选择7bit时,您同意内容中的所有行的长度都少于1000个字符。

只要您的内容符合这些规则,7bit就是最好的传输编码,因为不需要额外的工作;你刚从管道中读取/写入字节。它也很容易引人注目7bit内容并理解它。这里的想法是,如果你只是用简单的英文文本写作"你会没事的。但那wasn't true in 2005并且它今天都不是真的。

8Bit编码

8bit表示"我的数据可能包含扩展的ASCII字符;它们可以使用第8位(最高位)来指示标准US-ASCII 7位字符之外的特殊字符。"与7bit一样,仍有1000个字符的行限制。

8bit,就像7bit一样,实际上并没有对字节进行任何转换,因为它们被写入或从线路读取。这只是意味着您并不能保证所有字节都不会将最高位设置为" 1"。

这似乎是7bit的一步,因为它可以让您在内容中获得更多自由。但是,RFC 1341包含这个小节目:

  

截至本文档发布时,没有标准化的Internet传输,在邮件正文中包含未编码的8位或二进制数据是合法的。因此,没有任何情况下" 8bit"或者"二进制" Content-Transfer-Encoding在互联网上实际上是合法的。

RFC 1341在20多年前问世。从那时起,我们在8bit MIME Extensions中获得RFC 6152。但即便如此,行限制仍然适用:

  

请注意,此扩展名不会消除SMTP服务器限制行长度的可能性;服务器可以自由地实现此扩展,但仍设置行长限制不低于1000个八位字节。

二进制编码

binary8bit相同,只是没有行长度限制。你仍然可以包含你想要的任何字符,并且没有额外的编码。与8bit类似,RFC 1341声明它并非真正的合法编码传输编码。 RFC 3030使用BINARYMIME扩展了这一点。

引用的可打印

8BITMIME扩展程序之前,需要有一种方法可以通过SMTP发送无法7bit的内容。 HTML文件(可能包含超过1000个字符的行)和具有国际字符的文件就是很好的例子。 quoted-printable编码(在RFC 1341的第5.1节中定义)旨在处理此问题。它做了两件事:

  • 定义如何转义非US-ASCII字符,以便它们只能以7位字符表示。 (简短版本:它们显示为等号加上两个7位字符。)
  • 定义该行不超过76个字符,并且该换行符将使用特殊字符表示(然后进行转义)。

引用的Printable,由于逃避和短线,人类比7bit8bit更难阅读,但它确实支持更广泛的可能内容。

Base64编码

如果您的数据主要是非文本数据(例如:图片文件),则您没有多少选项。 7bit已脱离桌面。在MIME扩展RFC之前,8bitbinary不受支持。 quoted-printable可以工作,但效率很低(每个字节将由3个字符表示)。

base64是此类数据的理想解决方案。它将3个原始字节编码为4个US-ASCII字符,这是相对有效的。 RFC 1341进一步将base64 - 编码数据的行长度限制为76个字符以适合SMTP消息,但当您在固定时拆分或连接任意字符时,这相对容易管理长度。

最大的缺点是base64 - 编码数据几乎完全是人类无法读取的,即使它只是"普通"下面的文字。

答案 1 :(得分:0)

使用 content-transfer-encoding: 7bit 正文中使用的字节(或更正确的部分边界内)应该表示 ascii 字符,而不是扩展的 ascii 字符。这意味着 0-127 十进制(不使用第 8 位)。

由于未使用第 8 位,这意味着您无法使用 utf-8iso8859-7 字节对文本进行编码,因为它们使用第 8 位。您也不能添加二进制内容。

使用 content-transfer-encoding: 8bit 您可以使用任何可能的字节,这意味着您可以使用 utf-8 字节或 iso8859-7 字节(均假设8BITMIME 扩展名用于 SMTP)。然而,由于仍然适用的最大行限制,您添加二进制内容仍然不安全,这可能会用换行符破坏您的字节。

现在即使使用 7 位内容传输编码,您仍然可以将 content-typecharset 参数设置为 utf-8,只要您仍然将字节保持在 0-127 的边界之间.

例如使用 7bit content-transfer-encoding 表示 ascii 之外的字符的一种可能方法是使用 html code characters(带有 content-type: text/html

许多电子邮件客户端会根据情况将 content-transfer-encoding 设置为 7bit8bit。例如。 7bit 发送英文文本时,8bit 发送多语言文本时。并且总是有 quoted-printablebase64 的选项,它们的字符也不使用第 8 位,但这超出了范围 问题。