附件可以位于 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。
我知道多部分电子邮件的每个部分本身都可以是多部分。附件是否仅作为顶级部分添加,或者它们也可以在嵌套的多部分中?
例如我的意思,这里 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。