【问题标题】:How to set multiple conditions (AND and OR) on imaplib.IMAP4_SSL.search()如何在 imaplib.IMAP4_SSL.search() 上设置多个条件(AND 和 OR)
【发布时间】:2021-01-17 02:45:21
【问题描述】:

我需要根据某些条件过滤电子邮件并标记它们。

这是我的代码:

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 中导入条件,它们被划分为来自、文本、主题,然后我对它们施加条件。

问题在于代码会选择每封未见过的电子邮件,无论来自测试和主题。

我已经清楚逻辑但无法正确转换为代码。 mail.search 必须做的是: AND UNSEEN AND (OR FROM "####" OR SUBJECT "####") 这意味着把所有看不见的东西放在那些有 OR "那个主题" OR他们来自“那个人”。

以另一种方式,将所有来自 xxx 的 OR 标记为主题 xxx 但也 (AND) UNSEEN。

【问题讨论】:

  • AND 是默认运算符,不能指定。 OR 是一个前缀运算符,它有两个参数。请记住,并非所有服务器都能很好地实现搜索语言,但您可能希望一个术语看起来像 UNSEEN OR (FROM ...) (SUBJECT ...)。如果您开始将其中的两个或三个以上混合在一起,您可能会溢出远程服务器的搜索堆栈。
  • 不幸的是,你给我的选项不起作用..还只是指出那些 FROM 和 SUBJECT 也是 UNSEEN 所以如果我把 OR 放在那个位置它只会给我所有看不见的而不是看不见的有那些 FROM 和 SUBJECT
  • OR 不是中缀运算符。它是前缀运算符。这并不意味着它在英语中的含义是:(UNSEEN)(OR (FROM ...) (SUBJECT ...))。 OR 影响后面的两件事,而不是之前和之后。
  • 英文,OR 介于两者之间:x or y。 x 和 y 是之前和之后。在 IMAP 搜索语言中,OR 位于事物之前:OR X Y. x 和 y 都在之后.
  • OR 只需要两个操作数。如果你想要更多,你需要链接它们:OR (X) (OR (Y) (Z)),或者也许:OR (OR (X) (Y)) (Z) 例如。从技术上讲,括号不应该是必需的,但它可能会有所帮助。

标签: python-3.x email imap imaplib


【解决方案1】:

在 IMAP 搜索语言中,AND 是默认操作,OR 是双操作数前缀操作。

对于AND,您只需将它们粘在一起即可:“a 和 b”是 A B

对于OR,这意味着如果你想要“a or b”,你需要写“OR (A) (B)”。从技术上讲,括号并不是真正需要的,但如果您的条件变得复杂,可能会有所帮助。

如果您想要两个以上的东西,则需要将 OR 链接在一起。每一个只能带两个参数。您可以将“x or y or z”写成OR (OR X Y) ZOR X (OR Y Z)。同样,括号是可选的,但可能有助于某些服务器更好地解析它。

将所有这些“a and (x or y or z)”组合在一起就是A OR OR X Y Z

有很多服务器软件不能很好地处理复杂的查询。如果您的查询变得过于复杂或服务器实现边缘化,您可能需要考虑自己缓存元数据(使用UID FETCH BODY[HEADER])并在本地进行搜索。这些数据在理论上是不可变的,因此您应该只需要获取一次。

【讨论】:

    猜你喜欢
    • 2014-05-26
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 2021-09-18
    • 2017-09-09
    相关资源
    最近更新 更多