【问题标题】:Search Gmail using imaplib using double quotes - how to avoid search command error使用双引号使用 imaplib 搜索 Gmail - 如何避免搜索命令错误
【发布时间】:2019-10-21 03:43:56
【问题描述】:

我需要在某人的 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"'))

^^ 有效,但返回 >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']”

任何想法都将不胜感激。

【问题讨论】:

  • \" 应该可以工作。来自原始 openssl s_client:<<< b UID SEARCH BODY "\"foo bar\"" >>> * SEARCH >>> b OK SEARCH completed (Success)
  • @Max 我不熟悉openssl s_client,你能扩展一下吗?
  • openssl s_client -connect server:port -crlf 基本上只是启用了 SSL/TLS 的 telnet。例如:openssl s_client -connect imap.gmail.com:993 -crlf

标签: python search gmail imaplib


【解决方案1】:

正如上面 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() 搜索,您还需要更新您的 fetch 调用以...

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

【讨论】:

    【解决方案2】:

    这应该可行:

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

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

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

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

    mail.debug = 4
    

    【讨论】:

    • 这给了我与 Type, data = mail.search(None, ('Since 01-Jan-2016'), ('BODY "foo bar"')) 相同数量的电子邮件只是忽略双引号:(
    • 我仍然收到超过 125,000 封电子邮件,尽管它正在传递:'BODY "\\"foo bar\\""
    • 您可以试试X-GM-RAW,它使用 Gmail 搜索语言,而不是 IMAP 搜索语言。
    • 这是有效的:mail.uid('search', None, ('Since 01-Jan-2016'), 'X-GM-RAW', r'"\"foo bar\ ""')
    猜你喜欢
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 2011-12-15
    • 2013-08-15
    • 1970-01-01
    相关资源
    最近更新 更多