确定MIME电子邮件部分是文件还是消息文本

时间:2012-10-01 23:45:01

标签: python email mime email-attachments email-headers

作为某些电子邮件批处理的一部分,我们需要解码并清理消息。该过程的一个关键部分是分离邮件的邮件正文和邮件附件。最棘手的部分是确定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文件),这确实很奇怪。进入作文窗口。

1 个答案:

答案 0 :(得分:3)

我不是很关注你,但是,如果你想要正文,我会假设任何文本/纯文本或文本/ html内容类型,内联内容处理,没有文件名或没有内容id,可能是身体的一部分。