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

时间:2015-11-13 09:00:03

标签: email mime

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

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

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

我问,因为我从https://stackoverflow.com/a/27556667/492336遇到了这段代码:

    # 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,但无法确定是否可以嵌套文件附件。

2 个答案:

答案 0 :(得分:6)

没有处方限制,你很难争论所有multipart类型的单一政策 - 它们有着截然不同的目的。

例如,使用

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

...大多数希望提供消息HTML视图的客户的理智行为是选择multipart/relatedmultipart/alternative及其所有附件,并使用它来显示消息,同时将PDF显示为单独的附件。如果您只处理顶级multipart/mixed,那么会看到附件,这似乎不是一种理智的方式。

另一种可以发生完全任意嵌套的情况是message/rfc822,其中附加的消息是一个完整的MIME消息,它可能反过来又包含另一个message/rfc822等。

任何带有(明示或暗示)Content-Disposition: attachment的内容都是“附件”;你有时会在里面看到“附件” multipart/alternative这意味着如果您正在显示该消息的替代视图,附件才有意义 - 我很难想出一个这样的例子,并且可能实际上推测它应该是被视为错误,并在呈现另一种替代方案时显示附件,以防万一。

答案 1 :(得分:2)

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