如何在imaplib.IMAP4_SSL.search上设置多个条件AND和OR

问题描述

我需要过滤电子邮件并根据某些条件对其进行标签。

这是我的代码:

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(或来自“ ####”或SUBJECT“ ####”),这意味着将所有看不见的标签贴在具有OR“那个主题”或他们来自“那个人”。

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

解决方法

在IMAP搜索语言中,AND是默认操作,而OR是两个操作数的 prefix 操作。

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

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

如果您需要两个以上的东西,则需要将OR链接在一起。每个参数只能使用两个参数。您可以将{x或y或z记为OR (OR X Y) ZOR X (OR Y Z)。同样,括号是可选的,但可以帮助某些服务器更好地解析它。

将所有“ a和(x或y或z)”一起记为A OR OR X Y Z

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...