【发布时间】: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