当将数据附加到我的电子邮件时,我注意到 Thunderbird 计算出的生成电子邮件的总大小比我附加的文件大得多。
以下是最近的例子:两张图片,一张 13MB,一张 3.6MB,总共大约 17MB。其中有四行文字。然后 Thunderbird 询问我是否真的要发送一封总大小为 22MB 的电子邮件。
这种差异是从哪里来的?5MB 的文本听起来有点多。
答案1
您的数据为 17 MiB。1 MiB 等于 1024 KiB。1 KiB 等于 1024 B。1 字节有 8 位。因此,1 字节等于 142,606,336 位。
Base 64 编码将每六位编码为一个单独的字节。所以我们需要大约 23,767,722 个字节。除以 1024 两次可得到 22.67 MiB。这就是 22 MiB 的由来。
电子邮件是一项相当古老的技术,并且不假设 8 位清洁管道。
答案2
电子邮件为何变得更大?
因为数据以 ASCII 编码,base64
将最多三个字节的组编码为四个可打印的 ASCII 字符组。通常,这些可打印字符组随后被分成几行。
结果是编码后的数据刚好是原始数据的 1⅓ 倍多。
为什么要使用 base64?
电子邮件历史悠久,最初设计用于传输文本。只有代表 ASCII 可打印字符的字节值才能可靠地通过地球上各种各样的电子邮件系统,其中一些系统可能会出现问题。
因此,MIME 设计了两种方案将其他数据编码为 ASCII 文本 - “quoted-printable” 设计用于大多数带有少量其他位的 ASCII 文本,而“BASE64” 设计用于任意二进制数据。
SMTP 协议曾有过扩展,试图消除这些限制。首先是 1994 年的 8BITMIME,它允许更高的八位字节值,但不幸的是,它并没有消除与行长和行尾相关的限制,因此不适用于任意二进制数据;然后是 1995 年的 BINARYMIME,它允许传输包含任意二进制数据的消息。
然而,这些标准尚未得到广泛采用。一个问题是,如果邮件链中的一个跳转支持它们,但下一个跳转不支持,会发生什么?然后邮件服务器无法按原样发送邮件,它必须拒绝它作为无法送达的邮件并将其退回(这不太可能被用户接受),或者对其进行转换(这需要在邮件服务器中编写大量额外代码)。由于 MIME 规则不允许在多部分类型上使用内容传输编码,因此转换尤其困难。