作为某些电子邮件批处理的一部分,我们需要解码并清理消息。该过程的一个关键部分是分离邮件的邮件正文和邮件附件。最棘手的部分是确定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
消息时不会显示为内联(例如PDF文件),这确实很奇怪。进入作文窗口。
答案 0 :(得分:3)
我不是很关注你,但是,如果你想要正文,我会假设任何文本/纯文本或文本/ html内容类型,内联内容处理,没有文件名或没有内容id,可能是身体的一部分。