在发送电子邮件内容时,需要设置内容转移编码"头。我观察到了很多收到的电子邮件标题。一些电子邮件使用" 7bit"有些人正在使用" 8bit"。
这两者有什么区别?推荐哪个?电子邮件正文是否需要特殊编码才能设置这些标题?
答案 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
只是意味着"我的数据只包含US-ASCII字符,每个字符只使用低7位。"您基本上保证内容中的所有字节都符合SMTP的限制,因此无需特殊处理。你可以按原样阅读。
请注意,当您选择7bit
时,您同意内容中的所有行的长度都少于1000个字符。
只要您的内容符合这些规则,7bit
就是最好的传输编码,因为不需要额外的工作;你刚从管道中读取/写入字节。它也很容易引人注目7bit
内容并理解它。这里的想法是,如果你只是用简单的英文文本写作"你会没事的。但那wasn't true in 2005并且它今天都不是真的。
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个八位字节。
binary
与8bit
相同,只是没有行长度限制。你仍然可以包含你想要的任何字符,并且没有额外的编码。与8bit
类似,RFC 1341声明它并非真正的合法编码传输编码。 RFC 3030使用BINARYMIME
扩展了这一点。
在8BITMIME
扩展程序之前,需要有一种方法可以通过SMTP发送无法7bit
的内容。 HTML文件(可能包含超过1000个字符的行)和具有国际字符的文件就是很好的例子。 quoted-printable
编码(在RFC 1341的第5.1节中定义)旨在处理此问题。它做了两件事:
引用的Printable,由于逃避和短线,人类比7bit
或8bit
更难阅读,但它确实支持更广泛的可能内容。
如果您的数据主要是非文本数据(例如:图片文件),则您没有多少选项。 7bit
已脱离桌面。在MIME扩展RFC之前,8bit
和binary
不受支持。 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-8
或 iso8859-7
字节对文本进行编码,因为它们使用第 8 位。您也不能添加二进制内容。
使用 content-transfer-encoding: 8bit 您可以使用任何可能的字节,这意味着您可以使用 utf-8
字节或 iso8859-7
字节(均假设8BITMIME
扩展名用于 SMTP)。然而,由于仍然适用的最大行限制,您添加二进制内容仍然不安全,这可能会用换行符破坏您的字节。
现在即使使用 7 位内容传输编码,您仍然可以将 content-type
的 charset
参数设置为 utf-8
,只要您仍然将字节保持在 0-127 的边界之间.
例如使用 7bit
content-transfer-encoding 表示 ascii 之外的字符的一种可能方法是使用 html code characters(带有 content-type: text/html
)
许多电子邮件客户端会根据情况将 content-transfer-encoding
设置为 7bit
或 8bit
。例如。 7bit
发送英文文本时,8bit
发送多语言文本时。并且总是有 quoted-printable
和 base64
的选项,它们的字符也不使用第 8 位,但这超出了范围
问题。