【问题标题】:Python IMAP search using a subject encoded with iso-8859-1使用 iso-8859-1 编码的主题的 Python IMAP 搜索
【发布时间】:2011-08-04 03:54:36
【问题描述】:

我从另一个帐户向自己发送了一封主题为 Test de réception en local 的电子邮件。现在使用 IMAP,我想找到按主题搜索的电子邮件。

在搜索ALL 并在输出中查找电子邮件时,我看到:
Subject: =?ISO-8859-1?Q?Test_de_r=E9ception_en_local?=

所以现在,用 imap 搜索,我试试:

M = imaplib.IMAP4_SSL('imap.gmail.com', 993)
M.login('user@gmail.com', 'password')
M.select('[Gmail]/All Mail')

subject = Header(email_model.subject, 'iso-8859-1').encode() #email_model.subject is in unicode, utf-8 encoded
typ, data = M.search('iso-8859-1', '(SUBJECT "%s")' % subject)
for num in data[0].split():
    typ, data = M.fetch(num, '(RFC822)')
    print 'Message %s\n%s\n' % (num, data[0][1])
M.close()
M.logout()

print 'Fin'

如果您打印出subject,您会看到结果与我在之前更广泛的搜索中从 IMAP 服务器获得的结果完全相同。然而,在进行这种更具体的搜索时,它似乎并不匹配。

对于搜索,我已经尝试了所有我能想到的:

typ, data = M.search('iso-8859-1', '(HEADER subject "%s")' % subject)
typ, data = M.search('iso-8859-1', 'ALL (SUBJECT "%s")' % subject)

还有一些我现在想不起来的,都没有运气。

我可以搜索(和匹配)主题仅使用 ASCII 的电子邮件,但它不适用于任何应用了编码的主题。所以...

对于 IMAP,使用应用了编码的主题搜索电子邮件的正确方法是什么?

谢谢

【问题讨论】:

    标签: python search imap gmail-imap


    【解决方案1】:

    与 IMAP 服务器通信时,请与 IMAP RFC 联系。

    您必须删除多余的引号,并且不得对字符串进行编码。此外,charset 指定搜索查询的字符集,而不是消息头的字符集。这应该有效(对我有用):

    M.search("utf-8", "(SUBJECT %s)" % u"réception".encode("utf-8"))
    # this also works:
    M.search("iso8859-1", "(SUBJECT %s)" % u"réception".encode("iso8859-1"))
    

    编辑:

    显然,某些服务器(至少截至 2013 年 8 月的 gmail)仅在以文字形式发送时才支持 utf-8 字符串。 Python imaplib 对文字参数的支持非常有限,最好的方法是:

    term = u"réception".encode("utf-8")
    M.literal = term
    M.search("utf-8", "SUBJECT")
    

    【讨论】:

    • 我会试试这个。这似乎是有道理的。感谢您的回复!
    • 我收到SEARCH command error: BAD ['Could not parse command'] 错误。甚至尝试使用相同的字符串u'réception'。什么给了?
    • @john2x,可能是 IMAP 服务器问题。服务器端正在运行哪些软件?
    • @john2x,它以前可以工作,但现在失败了。显然他们改变了字符集处理,稍后再看看。
    • @john2x,好的,gmail IMAP 现在只允许 UTF-8 字符串以文字形式进行搜索。我已经更新了答案以反映这一点,但总的来说这些都是坏消息:python imaplib 只能在 IMAP 命令中传递一个(最后一个)文字参数。原始代码仍然适用于其他 imap 服务器,例如与 Dovecot。
    【解决方案2】:

    此代码在 2021-2022 年有效。尝试计算其他 SUBJECT 的电子邮件。如果您需要电子邮件内容,请使用 mails_list。

    import imaplib
    import mailbox
    
    user = 'your@email.com'
    password = 'secure_password'
    imap_url = 'imap.gmail.com'
    
    M = imaplib.IMAP4_SSL(imap_url)
    M.login(user, password)
    
    M.select()
    
    term = u"Test results".encode("utf-8")
    M.literal = term
    typ, data = M.search("utf-8", "SUBJECT")
    
    mails_list = data[0].split()  # get all email's in list
    
    print(len(mails_list))  # get mails quantity for search query
    
    # close connection
    M.close()
    M.logout()
    

    【讨论】:

      猜你喜欢
      • 2012-09-23
      • 2011-12-27
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-21
      相关资源
      最近更新 更多