如何在 imaplib.IMAP4_SSL.search() 上设置多个条件(AND 和 OR)
How to set multiple conditions (AND and OR) on imaplib.IMAP4_SSL.search()
我需要过滤电子邮件并根据某些条件对其进行标记。
这是我的代码:
def get_inbox():
os.chdir("C:/Users/simeone/Desktop/FilterEmails")
df = {}
df = pd.read_excel("Filtri.xlsx", encoding='utf-8', sheet_name = ['FROM', 'TEXT', 'SUBJECT'])
filters = []
for key in df.keys():
fil = [ '(OR ' + key + ' ' + '"' + name + '"'+ ' UNSEEN)' for name in list(df[key][df[key].columns[0]])]
str1 = ' '.join(fil)
filters.append(str1)
filtro = ' '.join(filters)
mail = imaplib.IMAP4_SSL(host)
mail.login(username, password)
mail.select("inbox")
_, search_data = mail.search(None, filtro)
代码不完整,但这不是重点,因为错误是条件。
问题是条件。
我从 Excel 中导入条件,它们分为来源、文本、主题,然后我对它们施加条件。
问题是代码 select 每一封看不见的电子邮件,无论发件人测试和主题如何。
逻辑我很清楚,但无法正确转换为代码。
mail.search 必须做的是:AND UNSEEN AND (OR FROM "####" OR SUBJECT "####") 这意味着把所有看不见的东西贴在有 OR "that subject" 的人身上" 或者他们来自"那个人"。
换句话说,将所有来自 xxx OR 的主题标记为 xxx,但它们也是 (AND) UNSEEN。
在IMAP搜索语言中,AND
是默认操作,OR
是two-operandprefix操作。
对于 AND
你只需将它们粘在一起:“a 和 b”是 A B
。
对于OR
这意味着如果你想要“a或b”,你需要写“OR (A) (B)”。从技术上讲,括号并不是真正需要的,但如果您的条件变得复杂,可能会有所帮助。
如果您想要两个以上的东西,您需要将 OR 链接在一起。每个只能带两个参数。您可以将“x 或 y 或 z”写成 OR (OR X Y) Z
或 OR X (OR Y Z)
。同样,括号是可选的,但可以帮助某些服务器更好地解析它。
将所有这些组合在一起“a 和 (x 或 y 或 z)”是 A OR OR X Y Z
。
有很多服务器软件不能很好地处理复杂的查询。如果您的查询变得太复杂或服务器实现不完善,您可能需要考虑自己缓存元数据(使用 UID FETCH BODY[HEADER]
)并在本地进行搜索。该数据理论上是不可变的,因此您只需获取一次。
我需要过滤电子邮件并根据某些条件对其进行标记。
这是我的代码:
def get_inbox():
os.chdir("C:/Users/simeone/Desktop/FilterEmails")
df = {}
df = pd.read_excel("Filtri.xlsx", encoding='utf-8', sheet_name = ['FROM', 'TEXT', 'SUBJECT'])
filters = []
for key in df.keys():
fil = [ '(OR ' + key + ' ' + '"' + name + '"'+ ' UNSEEN)' for name in list(df[key][df[key].columns[0]])]
str1 = ' '.join(fil)
filters.append(str1)
filtro = ' '.join(filters)
mail = imaplib.IMAP4_SSL(host)
mail.login(username, password)
mail.select("inbox")
_, search_data = mail.search(None, filtro)
代码不完整,但这不是重点,因为错误是条件。 问题是条件。
我从 Excel 中导入条件,它们分为来源、文本、主题,然后我对它们施加条件。
问题是代码 select 每一封看不见的电子邮件,无论发件人测试和主题如何。
逻辑我很清楚,但无法正确转换为代码。 mail.search 必须做的是:AND UNSEEN AND (OR FROM "####" OR SUBJECT "####") 这意味着把所有看不见的东西贴在有 OR "that subject" 的人身上" 或者他们来自"那个人"。
换句话说,将所有来自 xxx OR 的主题标记为 xxx,但它们也是 (AND) UNSEEN。
在IMAP搜索语言中,AND
是默认操作,OR
是two-operandprefix操作。
对于 AND
你只需将它们粘在一起:“a 和 b”是 A B
。
对于OR
这意味着如果你想要“a或b”,你需要写“OR (A) (B)”。从技术上讲,括号并不是真正需要的,但如果您的条件变得复杂,可能会有所帮助。
如果您想要两个以上的东西,您需要将 OR 链接在一起。每个只能带两个参数。您可以将“x 或 y 或 z”写成 OR (OR X Y) Z
或 OR X (OR Y Z)
。同样,括号是可选的,但可以帮助某些服务器更好地解析它。
将所有这些组合在一起“a 和 (x 或 y 或 z)”是 A OR OR X Y Z
。
有很多服务器软件不能很好地处理复杂的查询。如果您的查询变得太复杂或服务器实现不完善,您可能需要考虑自己缓存元数据(使用 UID FETCH BODY[HEADER]
)并在本地进行搜索。该数据理论上是不可变的,因此您只需获取一次。