为什么我的电子邮件的大小比附件的大小大三分之一?

arc*_*pus 113 email thunderbird base64

在将数据附加到我的电子邮件时,我注意到 Thunderbird 计算的结果电子邮件的总大小比我附加的文件大得多。

这是最近的一个例子:两张图片,一张是 13MB,一张是 3.6MB,总共应该是大约 17MB。有四行文字。Thunderbird 然后问我是否真的想发送一封总大小为 22MB 的电子邮件。

这种差异从何而来?5MB 的文字听起来有点多。

Dav*_*rtz 214

您的数据为 17 MiB。一个 MiB 中有 1024 KiB。KiB 中有 1024 个 B。一个字节有 8 位。所以这是 142,606,336 位。

Base 64 编码将每六位编码为一个单独的字节。所以我们需要大约 23,767,722 个字节。除以 1024 两次得到 22.67 MiB。所以这就是 22 MiB 的来源。

电子邮件是一项相当古老的技术,并且不假定使用 8 位干净的管道。

  • 稍微解码最后一行:base-64 是一种使用一组有限的“保证安全字符”将附件编码为文本的方法,这些字符不会被某些中间设备(例如 az、AZ、0-9)弄乱 (80认同)
  • 而且,一旦您理解了 David 出色答案中的数学原理,您只需将附件的大小乘以 4/3 即可获得将发送的邮件消息的大小(加上实际文本)。 (65认同)
  • 即使电子邮件知道它有一个完整的 8 位管道,也必须进行编码,因为它基本上是一个文本流——某些字符提供控制功能,因此不能出现在您的数据中。话虽如此,有更好的编码技术,但还没有被采用。 (12认同)
  • base64 _实际上_所做的是每 3 个原始字节使用 4 个字节。虽然这听起来很相似,但这很重要,因为长度总是 4 的倍数,也因为没有理由到位级别。 (9认同)
  • @LorenPechtel 您可以愉快地在 MIME 消息中包含应用程序/八位字节流部分。您所要做的就是选择一个不会出现在数据中的边界。 (4认同)

plu*_*ash 51

为什么电子邮件更大?

因为数据的编码方式是base64将最多三个字节的组编码为四个可打印 ASCII 字符的组。通常,这些可打印字符组然后被分成几行。

结果是编码后的数据刚好超过1?倍原始数据的大小。

为什么使用base64?

电子邮件有着悠久的历史,最初设计用于承载文本。只有代表 ASCII 可打印字符的字节值才能可靠地通过地球上的各种电子邮件系统,其中一些可能会出现问题。

因此,MIME 设计了两种将其他数据编码为 ASCII 文本的方案——“quoted-printable”主要用于带有一些其他位的 ASCII 文本,“BASE64”用于任意二进制数据。

已经对 SMTP 协议进行了扩展以尝试消除这些限制。首先,1994 年的 8BITMIME,它允许更高的八位字节值,但遗憾的是没有去除与行长和行尾相关的限制,因此不适用于任意二进制数据;然后是 1995 年的 BINARYMIME,它允许传输包含任意二进制数据的消息。

然而,这些标准并未得到广泛采用。一个问题是,如果邮件链中的一个跃点支持它们而下一跃点不支持,会发生什么?邮件服务器然后不能按原样发送邮件,它必须要么拒绝它作为无法投递并退回(这不太可能被用户接受),要么转换它(这需要邮件服务器中的大量额外代码) . 关于不在多部分类型上使用内容传输编码的 MIME 规则使转换变得特别痛苦。

  • @igorsk:加上 Usenet/NN 被呈现并理解为有损,您可以在其中发布文章,但并非所有服务器上的所有订阅者都一定会收到它。关于在前一篇文章的后续文章中引用“足够多”的习惯(并且在很大程度上仍然存在),您的后续文章可以被_谁没有收到以前的文章_的人理解。相比之下,大多数(非垃圾邮件发送者)电子邮件发件人希望“系统”将他们的邮件发送给指定的收件人,尽管有时会在数小时或数天之后;今天,即使是短暂的延误,人们也会抱怨。 (2认同)