使用imap_tools过滤多个发件人地址失效问题求助
如何用imap_tools过滤多个指定发件人的邮件?
你当前用imap_tools过滤单一发件人(排除notifications@stripe.com)的代码正常,但尝试传入多个发件人列表到NOT(from_)时,会返回指定日期内的所有邮件,无法达到排除多个发件人的效果。
问题原因
imap_tools的NOT结合列表参数时,不会自动将多个发件人条件转为“或”逻辑。直接给NOT(from_=[...])的写法不符合IMAP查询的逻辑规则,导致过滤失效。
正确解法
需要用OR将多个要排除的发件人条件组合,再用NOT包裹整个OR条件,这样就能实现“排除来自列表中任意一个发件人的邮件”的需求。
修改后的代码示例:
from imap_tools import MailBox, A, AND, OR, NOT import datetime as dt from bs4 import BeautifulSoup username = "info@mysite.co.uk" password = "mypasword" imap_server = "mysite.co.uk" with MailBox(imap_server).login(username, password) as mailbox: # 用OR组合多个要排除的发件人,再整体用NOT包裹 exclude_senders = OR( from_="notifications@stripe.com", from_="noreply@wise.com" ) for msg in mailbox.fetch( AND(NOT(exclude_senders), date=dt.date(2022, 9, 9)) ): if msg.html: soup = BeautifulSoup(msg.html, "html.parser") print(msg.from_) print(msg.subject) print(msg.date) print(soup.prettify()) # 注意调用prettify方法需加括号 print(180 * "=")
逻辑说明
OR(from_="A", from_="B")表示“来自A 或者 来自B”的邮件- 外层的
NOT()会将这个结果取反,最终得到“既不是来自A,也不是来自B”的邮件 - 结合
AND(date=...)就能筛选出指定日期内、排除目标发件人的所有邮件
内容的提问来源于stack exchange,提问作者Martin H
相关产品推荐
相关产品推荐

