编程语言
首页 > 编程语言> > python – 确定MIME电子邮件部分是文件还是消息文本

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

作者:互联网

作为一些电子邮件批处理的一部分,我们需要解码和清理消息.该过程的一个关键部分是分离邮件的邮件正文和邮件附件.最棘手的部分是确定何时将Conent-Disposition:内联部分视为消息体替代或文件.

到目前为止,这段代码似乎处理了大多数情况:

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似乎对其所有多部分/相关消息执行此操作. Content-ID也可以用作提示,但根据RFC 2387,它不是一个指标.

因此,如果嵌入的图像被编码为具有Content-Disposition:inline的消息部分,则定义Content-ID并且没有文件名,则上述代码可能会错误地将其归类为消息体替代.

根据我从RFC中读到的内容,找到一个简单的检查并不是很希望(特别是因为根据RFC编码在现实世界中几乎没用,因为没有人这样做);但我想知道错误分类案件的可能性有多大.

合理

我可以有一组函数来处理每个multipart / * case并让它们间接递归.但是,我们并不在乎忠实的展示;事实上,我们通过tidy过滤所有HTML消息.相反,我们更感兴趣的是选择其中一个消息体替代方案并尽可能多地保存附件,即使它们是要嵌入的.

此外,由于用户将任意文件拖放到合成窗口中,因此在编写具有嵌入式附件的多部分/替代消息时,一些用户代理执行非常奇怪的事情,这些附件不打算以内联方式显示(例如PDF文件).

解决方法:

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

标签:python,mime,email,email-attachments,email-headers
来源: https://codeday.me/bug/20190630/1331406.html