消息被布置在任意的部件树中,父项是 multipart/* 或 message/rfc822 类型,子项是其他类型。 FETCH BODY[...] 可以任意提取这些部分。
很遗憾,消息没有标准布局。您可以获取 BODYSTRUCTURE 项来获取消息的 MIME 布局,但是很难通过肉眼解析。
话虽如此,但有一些常见的消息布局可以帮助您顺利完成任务。
最简单的是只有一个正文的消息,text/html 或 text/plain。只需获取BODY[TEXT]。
接下来是多格式,包括 text/html 和 text/plain。它的 MIME 结构通常如下所示:
+ multipart/alternative [TEXT]
|- text/plain [1]
\- text/html [2]
在这种情况下,您要获取BODY[2]。
如果邮件是单体的,带有附件,它看起来像这样:
+ multipart/mixed or multipart/related [TEXT]
|- text/html or text/plain [1]
|- image/jpg [2]
| ...
\- image/gif
在这种情况下,您需要BODY[1]。
最后是这两个:带有附件的多格式正文。它往往看起来像:
+ multipart/mixed or multipart/related [TEXT]
|-+ multipart/alternative [1]
| |- text/plain [1.1]
| \- text/html [1.2]
|- image/jpeg [2]
|- image/gif [3]
|...
\- image/png
在这种情况下,您可能需要BODY[1.2]。您的示例消息属于这种类型。
此外,正文可以使用 Quoted-Printable 或 Base64 编码进行编码。不幸的是,Baseline IMAP 没有为服务器提供任何方法来为您解码。如果消息是 ascii,则 Quoted-Printable 大部分都可以阅读,但在整个正文中会有很多 `=` 转义。如果它是base64,你将无法用肉眼破译它。 [BINARY IMAP 扩展](https://www.rfc-editor.org/rfc/rfc3516) 可以帮助解决这个问题,但这并没有被广泛部署。