msg.is_attachment() 是否足以从 python 中的电子邮件中获取所有附件,或者我们是否也应该检查 msg.is_multipart()?

Is msg.is_attachment() enough to get all the attachments from email in python, or should we check that msg.is_multipart() too?

我正在搜索来自特定发件人的具有特定主题的邮件。 我收到第一封电子邮件,然后想从中检索附件。

我正在使用 imaplib。

我的代码-

_, mails = imap_client.search(None, f'(FROM "{sender}")', f'(SUBJECT "{subject}")')
first_mail = mails[0].split()[0]
mail_msgs = [email.message_from_bytes(response[1]) for response in first_mail if isinstance(response, tuple)]
msg = mail_msgs[0]
attachments = [part for part in msg.walk() if msg.is_multipart() and part.get_content_disposition() == "attachment"]

我的问题是关于最后一行 - 要检索附件,我是否需要检查消息是否同时为 is_multipart()get_content_disposition()

attachments = [part for part in msg.walk() if msg.is_multipart() and part.get_content_disposition() == "attachment"]

或者只检查 get_content_disposition() 就足够了吗?

attachments = [part for part in msg.walk() if part.get_content_disposition() == "attachment"]
    

可能存在错误

email.message_from_bytes() 不保证 return 一个 email.message.EmailMessage 对象。它 return 是一个 email.message.Message 对象,不一定具有 is_attachment() 方法。 所以你可能想将 _class=email.message.EmailMessage 传递给 email.message_from_bytes().

问题的答案

Message.is_multipart() 检查消息是否为多部分消息。这并不意味着它包含附件 文件 。它还将匹配使用双重 text/htmltext/plain 正文发送的电子邮件。如果你想过滤多部分消息,这就是你所需要的。如果你想过滤 file 附件,你想在邮件 parts 上使用 part.is_attachment() 进行过滤。在后一种情况下,is_attachment() 就足够了。