【发布时间】:2012-09-22 20:31:32
【问题描述】:
作为一些电子邮件批处理的一部分,我们需要解码和清理消息。该过程的一个关键部分是将邮件的邮件正文和邮件附件分开。最棘手的部分是确定何时将 Conent-Disposition: inline 部分视为消息正文替代项或文件。
到目前为止,这段代码似乎处理了大多数情况:
from email import message_from_string
def split_parts(raw):
msg = message_from_string(raw)
bodies = []
files = []
for sub in msg.walk():
if sub.is_multipart():
continue
cd = sub.get("Content-Disposition", "")
if cd.startswith("attachment") or (cd.startswith("inline") and
sub.get_filename()):
files.append(sub)
else:
bodies.append(sub)
return bodies, files
请注意,内联部分依赖于在标题中指定文件名,Outlook 似乎对其所有multipart/related 邮件都这样做。 Content-ID 也可以用作提示,但根据RFC 2387,它不是这样的指标。
因此,如果嵌入图像被编码为具有Content-Disposition: inline、定义Content-ID 并且没有文件名的消息部分,则上述代码可能会错误地将其分类为消息正文替代项。
从我从 RFC 中读到的内容来看,找到简单检查的希望不大(特别是因为根据 RFC 进行编码在现实世界中几乎没有用,因为没有人这样做);但我想知道误分类的几率有多大。
基本原理
我可以有一组函数来处理每个multipart/* 案例并让它们间接递归。但是,我们不太关心忠实的展示。事实上,我们通过tidy过滤所有HTML消息。相反,我们更感兴趣的是选择一种消息正文替代方案并尽可能多地保存附件,即使它们打算嵌入。
此外,由于用户将任意文件拖放到合成窗口。
【问题讨论】:
-
我认为没有任何一种标准方法可以做到这一点。如果您想模拟客户端如何处理这些消息,请实现您自己的偏好,以了解如何从一组
multipart/alternative中选择一个部分(或者实际上我猜还有multipart/mixed和multipart/related和 and and .. .) 并将其他的声明为“附件”。
标签: python email mime email-attachments email-headers