问题描述
我需要过滤电子邮件并根据某些条件对其进行标签。
这是我的代码:
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) Z
或OR X (OR Y Z)
。同样,括号是可选的,但可以帮助某些服务器更好地解析它。
将所有“ a和(x或y或z)”一起记为A OR OR X Y Z
。
有很多服务器软件不能很好地处理复杂的查询。如果查询变得太复杂或服务器的实现非常有限,则可能需要考虑自己缓存元数据(使用UID FETCH BODY[HEADER]
)并在本地进行搜索。从理论上讲,这些数据是不可变的,因此您只需提取一次即可。