使用双引号使用 imaplib 搜索 Gmail - 如何避免搜索命令错误

Search Gmail using imaplib using double quotes - how to avoid search command error

我需要在某人的 Gmail 帐户中搜索特定短语 "foo bar"。如果我搜索没有双引号的 foo bar,我会收到 >125,000 封电子邮件,当我使用双引号(从浏览器)搜索时,我会收到 180 封我正在寻找的相关电子邮件。但是,imaplib 的搜索方法不允许我使用双引号。我能做些什么吗?

这是我已经尝试过的:

import imaplib
mail = imaplib.IMAP4_SSL(SMTP_SERVER)
mail.login(USERNAME,PASSWORD)
mail.select(mail_box)
Type, data = mail.search(None, ('Since 01-Jan-2016'), ('BODY "foo bar"'))

^^ 有效,但 returns >125,000 封电子邮件,大部分不相关 - 任何同时包含 foo 和 bar 的电子邮件

Type, data = mail.search(None, ('Since 01-Jan-2016'), ('BODY ""foo bar""'))
Type, data = mail.search(None, ('Since 01-Jan-2016'), ('BODY "\"foo bar\""'))
Type, data = mail.search(None, ('Since 01-Jan-2016'), ('BODY """foo bar"""'))

^^^ 以上所有都抛出以下错误:"error: SEARCH command error: BAD [b'Could not parse command']"

如有任何想法,我们将不胜感激。

这应该有效:

mail.search(None, r'BODY "\"Security Alert\""')

r 将其转换为原始字符串,这样反斜杠就不会被 Python 解释。然后反斜杠被发送到服务器并正确解释。

您应该能够调整此格式以供您使用。

注意:要查看正在发送的内容,请暂时将 mail.debug 设置为较大的数字,例如 4。这会显示流量。看到这里,我看到引号实际上并没有被转义(因为 Python 将退格键视为它的转义)。

mail.debug = 4

正如上面 Max 所建议的,这是有效的:

import imaplib
mail = imaplib.IMAP4_SSL(SMTP_SERVER)
mail.login(USERNAME,PASSWORD)
mail.select(mail_box)

Type, data = mail.uid('search', None, ('Since 01-Jan-2016'), 'X-GM-RAW', r'"\"foo bar\""')

请注意,如果您正在使用 mail.uid() 搜索,您还需要更新您的提取调用以...

mail.uid('fetch', ID, '(RFC822)')