You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:18:28