【问题标题】:Determining if a MIME email part is a file or message text确定 MIME 电子邮件部分是文件还是消息文本
【发布时间】: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/mixedmultipart/related 和 and and .. .) 并将其他的声明为“附件”。

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


【解决方案1】:

我并没有完全关注你,但是,如果你想要正文,我会假设任何内容类型为 text/plain 或 text/html 的内容,具有内联内容处置,没有文件名或没有 content-id,可能是身体的一部分。

【讨论】:

  • 我只是更仔细地重新阅读了section 3.2 from RFC 2387,我想我将不得不辞职,假设实际上似乎没有人使用start 容器的start 参数。直到我找到一个案例,这将迫使我为我的小、简单和可爱的功能增加复杂性。
猜你喜欢
  • 2021-02-06
  • 1970-01-01
  • 2015-12-11
  • 2015-06-09
  • 2014-09-26
  • 2013-07-13
  • 2017-07-23
  • 2012-10-31
  • 2019-04-06
相关资源
最近更新 更多