内容传输编码 7 位或 8 位

2023-12-11

发送电子邮件内容时,需要设置“内容传输编码”标头。我观察到收到的许多电子邮件的标题。有些电子邮件使用“7bit”,有些则使用“8bit”。

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


阅读起来可能有点密集,但 RFC 1341 的“内容传输编码”部分包含所有详细信息:

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

情况有点每况愈下。这是我的总结:

背景

根据定义 (RFC 821),SMTP 将邮件限制为每行 1000 个字符,每行 7 位。这意味着您沿着管道发送的任何字节都不能将最高有效(“最高阶”)位设置为“1”。

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

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

7位编码

7bit简单的意思是“我的数据仅包含 US-ASCII 字符,每个字符仅使用低 7 位。”您基本上可以保证内容中的所有字节都已遵守 SMTP 的限制,因此不需要特殊处理。您可以按原样阅读。

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

只要您的内容遵守这些规则,7bit是最好的传输编码,因为不需要额外的工作;您只需在字节从管道中出来时读取/写入字节即可。也很容易吸引眼球7bit内容并理解它的意义。这里的想法是,如果您只是用“纯英文文本”编写,那就没问题。但那个2005年的情况并非如此但今天情况并非如此。

8位编码

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

8bit, 就像7bit,在将字节写入或从线路中读取时,实际上不会对字节进行任何转换。这只是意味着您不能保证没有任何字节的最高位设置为“1”。

这似乎是一个进步7bit,因为它为您的内容提供了更多自由。然而,RFC 1341 包含以下花絮:

截至本文档发布时,尚不存在可以合法在邮件正文中包含未编码的 8 位或二进制数据的标准化互联网传输。因此,在任何情况下,“8 位”或“二进制”内容传输编码在互联网上实际上是合法的。

RFC 1341 已于 20 多年前问世。从那时起我们就得到了8 位 MIME 扩展 in RFC 6152。但即便如此,线路限制仍然可能适用:

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

二进制编码

binary是相同的8bit,除了没有行长度限制。您仍然可以包含任何您想要的字符,并且没有额外的编码。如同8bit,RFC 1341 声明它并不是真正合法的编码传输编码。RFC 3030将此扩展为BINARYMIME.

引用可打印

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

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

由于转义和短行,引用的可打印内容比人类更难阅读7bit or 8bit,但它确实支持更广泛的可能内容。

Base64 编码

如果您的数据主要是非文本(例如:图像文件),则您没有太多选择。7bit已经不在讨论范围内了。8bit and binary在 MIME 扩展 RFC 之前不受支持。quoted-printable可以,但效率很低(每个字节将由 3 个字符表示)。

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

最大的缺点是base64- 编码数据几乎完全无法被人类读取,即使它只是下面的“纯”文本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

内容传输编码 7 位或 8 位 的相关文章

随机推荐

  • 注意动态添加的类

    如果将类动态添加到元素 是否有一个侦听器可以在其中监视和运行代码 我使用 WordPress CMS 和一个插件 我正在使用我们动态添加一个类 我想在发生这种情况时捕捉到并运行一些自定义代码 更改 onChange 似乎不起作用 test
  • 为什么 Firefox 的最小宽度为 615px?

    我对媒体查询非常陌生 所以我在 Firefox 12 0 上使用 min width 属性 发现它不起作用 经过一番尝试和尝试这个可爱的网站之后 http barrow io lab media query viewport 我发现我的 F
  • 如何使用 PHP 向网页发出请求?

    我想要实现的是 第一 我想查询像谷歌这样的页面 但不填写手动提交的搜索 第二 我想获取结果并将其保存到数据库中 我在这里看到了使用 C 执行此操作的示例 http www farooqazam net c sharp auto click
  • 如何追踪IOS5的崩溃情况?

    我是IOS开发新手 我发生了崩溃 但它没有在我的程序中显示崩溃位置 有没有办法在 IOS 5 1 中显示崩溃位置 谢谢 None
  • 如何在C#中将数字拆分为单独的数字? [复制]

    这个问题在这里已经有答案了 说我有12345 我想要每个号码的单独项目 一个字符串甚至一个单独的数字都可以 Split 方法是否对此有重载 我会使用模数和循环 int GetIntArray int num List
  • Scipy ndimage 形态学运算符使我的计算机内存 RAM (8GB) 饱和

    我需要使用半径为 17 或更大的 3D 结构元素来计算形状为 400 401 401 大小为 64320400 字节的 3D 数组的形态开口 结构体元素ndarray的大小为 42875 字节 使用scipy ndimage morphol
  • 使用 ExtJS 获取响应文件

    我使用 ExtJS 为我的程序构建客户端 有一种情况 我想向服务器发送 Ajax 请求 并获取响应文件 二进制文件 而不是纯文本文件 即 XLS 或 PDF 我如何获取 ExtJS 返回的文件 我的意思是该文件可以下载并存储到客户端 我无法
  • SQL 字符串:计算字符串内的单词数

    我在这里搜索了许多问题 但我发现的所有正确答案都是针对不同的语言 如 Javascript 等 我在 SQL 中有一个简单的任务 但我似乎找不到简单的方法来完成 我只需要计算 SQL 字符串 一个句子 内的 单词 数量 您可以在我的示例中看
  • OpenCV 错误 - Core.hpp 标头必须编译为 C++

    我努力了Core hpp Base hpp header must be compiled as C 错误 我将 BITCODE 设置为NO import
  • 当子类化 DBI 时,Perl DBI 将设置 SQLite DB cache_size 视为写入操作

    我有一个 Perl 程序 在过去两年里我们每天都成功运行 但今天崩溃并显示错误消息 致命错误 无法执行 PRAGMA cache size 1000000 尝试写入只读数据库 有问题的 SQLite 数据库是只读的 并且一直都是 并且代码始
  • 用数字创建日期 (new Date(2012, 03, ...) 给出错误的月份 (+1)

    当创建一个new Date对象使用零件的数字 我得到的值正是一个月领先于我为 月 输入的值 new Date 2012 05 17 00 00 00 Sun Jun 17 2012 00 00 00 GMT 0800 HKT june 但是
  • 实时模板中的当前文件路径

    是否可以在 IntelliJ 的实时模板中获取当前文件的完整路径 我尝试过使用groovyScript new File absolutePath 函数 但返回 Applications IntelliJ IDEA app Contents
  • jQuery - 如何向图像添加标记

    我正在考虑如何向图像添加一些标记 我的意思是像谷歌地图中的东西 地点标记 我有一个图像 如果用户单击该图像 我想在用户单击的那个地方添加一些其他图像 例如 如果用户单击图像中的 3 个位置 我想在这 3 个位置上添加我的图像 我知道 如何获
  • 无法创建 SqlDataSourceEnumerator

    using System using System Data using System Data Sql using System Collections namespace Tinkering with SqlDataSourceEnum
  • 我可以动态更改 asp.net 中的 FormsAuthentication cookie 名称吗?

    我想动态设置 FormsAuthentication cookie 名称 例如 guid 我怎样才能做到这一点 我已经可以在 web config 中将其更改为我想要的任何内容 我只是无法用代码和动态方式做到这一点 请帮忙
  • 生成不带公共文件系统的远程进程

    email protected 8 gt spawn email protected tut test hello 5 我想在 bar del com 上生成一个进程 它没有文件系统访问 foo hyd com 从我生成该进程的地方 运行模
  • OpenMP 并行线程

    我需要并行化这个循环 我认为使用这是一个好主意 但我以前从未研究过它们 pragma omp parallel for for std set
  • jQuery.Lazy():插件未加载我的“li”内容

    The Lazy插件对我来说不太好用 我什至添加了alerts找出问题所在 但对我来说一切都很好 我尝试使用this我的画廊插件的效果 Here是我使用 jQuery Lazy 的网站页面 HTML div class gallery bo
  • 从事件处理程序返回值到 JavaScript 的父函数

    我需要将事件处理程序返回的值放入首先启动事件的函数中 只是为了返回仅在事件处理程序中接收的值 我相信应该有一种简单的方法来实现这一点或从不同的角度解决问题 我实际上需要做的是 创建一个新的 img DOM 对象以将 dataURL 提供给其
  • 内容传输编码 7 位或 8 位

    发送电子邮件内容时 需要设置 内容传输编码 标头 我观察到收到的许多电子邮件的标题 有些电子邮件使用 7bit 有些则使用 8bit 这两者有什么区别 推荐哪个 电子邮件正文是否需要任何特殊编码才能设置这些标头 阅读起来可能有点密集 但 R