IMAP 协议是否支持多部分正文中的二进制文件?

Does IMAP protocol support binary inside multi-part body?

IMAP RFC:

8-bit textual and binary mail is supported through the use of a
[MIME-IMB] content transfer encoding. IMAP4rev1 implementations MAY
transmit 8-bit or multi-octet characters in literals, but SHOULD do
so only when the [CHARSET] is identified.

Although a BINARY body encoding is defined, unencoded binary strings are not permitted. A "binary string" is any string with NUL characters. Implementations MUST encode binary data into a textual form, such as BASE64, before transmitting the data. A string with an excessive amount of CTL characters MAY also be considered to be binary.

  1. 如果实现必须转换为 base64,为什么 RFC 说 "BINARY body encoding is defined"。因为每次我们需要将数据作为 base64(或其他格式)发送时,实际上不支持二进制。还是我读错了什么?

  2. IMAP支持MIME multi-part,这个里面的parts可以有二进制数据吗?那是内容传输编码?

我是 IMAP/HTTP 的新手,问这个问题的原因是,我必须开发一个同时支持 HTTP 和 IMAP 的服务器,在 HTTP 服务器中接收二进制数据(巨大的多部分数据,包含内容-传输编码为二进制),FETCH 可以在 IMAP 中完成。问题是如果 IMAP 不支持二进制,我需要解析数据并将 multipart 中的每个部分转换为 base64。我认为这是严重的性能问题。

不幸的是,答案是“也许”。

MIME RFC 支持二进制,但 IMAP RFC 特别禁止发送 NULL 个字符。这可能是因为它们可能会让基于文本的解析器感到困惑,尤其是那些用 C 编写的解析器,其中 NULL 表示字符串结束。

一些 IMAP 服务器只是将正文视为“字节袋”,我怀疑很少有人(如果有的话)真正进行重新编码。因此,如果您要求完整的消息,您可能会得到它的字面内容。

如果您的客户可以处理 MIME-Binary,您可能就没问题了。

IMAP 扩展 RFC 3516 可以正确支持 BINARY,但未广泛部署。

附带说明:您为什么要使用多部分 MIME?这是一个奇怪的 HTTP 实现选择。