附件可以位于 MIME 的嵌套多部分中吗?

Can attachments be in a nested multipart in MIME?

我知道多部分电子邮件的每个部分本身都可以是多部分。附件是否仅作为顶级部分添加,或者它们也可以在嵌套的多部分中?

例如我的意思,这里 attachment1.doc 是嵌套的,而 attachment2.doc 是顶级部分。

multipart/mixed
   |---Title: text/plain
   |---Text content: text/plain
   |---Nested multipart: multipart/mixed
   |      |--- attachment1.doc (BASE64)
   |---attachment2.doc (BASE64)

我问是因为我遇到了来自 :

的这段代码
    # Iterate the different parts of the multipart message.
    for part in msg.walk():
        # Skip any nested multipart.
        if part.get_content_maintype() == 'multipart':
            continue

它在 Python 中,它们遍历邮件的不同部分以搜索附件,但会跳过本身是多部分的任何部分。

他们这样做是否正确?我尝试阅读 RFC3501,但找不到任何明确说明文件附件是否可以嵌套的内容。

没有规定的限制,您很难为所有 multipart 类型制定一项政策——它们具有截然不同的目的。

例如,像这样的消息

multipart/mixed
  +-- multipart/alternative
  |     +-- text/plain
  |     +-- multipart/related
  |           +-- text/html
  |           +-- image/png
  |           +-- image/png
  +-- application/octet-stream; name="attachment.pdf"

...对于大多数想要提供消息的 HTML 视图的客户端来说,理智的行为是选择 multipart/alternative 内的 multipart/related 及其所有附件,并且使用它来显示消息,同时将 PDF 显示为单独的附件。如果您只处理顶级 multipart/mixed,您 只会 看到附件,这似乎不是一个明智的方法。

另一种可能发生完全任意嵌套的情况是 message/rfc822,其中附加的消息是它自己的完整 MIME 消息,它可能依次包含另一个 message/rfc822,等等。

任何带有(明示或暗示)Content-Disposition: attachment 的东西都是 "attachment";你有时会在里面看到 "attachments" multipart/alternative 这意味着附件只有在您显示消息的替代视图时才有意义——我很难想出一个例子来证明这是真的,并且可能实际上推测它应该是视为错误,在渲染另一个替代方案时显示附件,以防万一。

嵌套的多部分是合法的,并且在一些用例中很常见。最重要的是,如果您使用 S/MIME 对包含文本和图片的多部分消息进行签名,您通常会有一个包含 multipart/mixed 和其他部分的顶级 multipart/signed,以及multipart/mixed 依次包含一个 text/plain 和一个 image/jpeg。