【问题标题】:Searching for UTF-8 encoded subjects with imaplib使用 imaplib 搜索 UTF-8 编码的主题
【发布时间】:2020-09-10 18:36:52
【问题描述】:

我有一些工作代码来获取邮件正文,我想用非 ascii 字符串过滤主题。其他论坛建议使用 .uid 类这样做,但这种行为对我来说不合逻辑。

当前代码:

import imaplib
import email

username = secret
password = secret

imap = imaplib.IMAP4_SSL("imap.gmail.com")

status, messages = imap.select("INBOX",readonly=True)

res, msg = imap.search(None, 'HEADER Subject "string to be encoded with UTF-8"')

建议代码:

import imaplib
import email

username = secret
password = secret

imap = imaplib.IMAP4_SSL("imap.gmail.com")

status, messages = imap.select("INBOX",readonly=True)

imap.literal = u"string to be encoded with UTF-8".encode('utf-8')
res, msg = imap.uid('SEARCH', 'CHARSET', 'UTF-8', 'SUBJECT')

suggested code 工作正常,但返回的数组 (msg[0]) 包含超出范围的邮箱索引。相反,当我使用 .search 类时,只要我搜索 ASCII 字符串(此处不接受 UTF-8 和非 UTF-8 编码的字符串),就会返回有效索引。因此,我不太了解.uid 的行为和逻辑。如果有人可以帮助我,我将不胜感激。

如何使用 UTF-8 字符串过滤主题?

【问题讨论】:

  • 'search' 和 'mid search' 之间的唯一区别在于它是否返回消息序列号(MSN,编号 1-N,n 是您邮箱中的邮件数)或唯一标识符( UID,编号增加,数字通常从不重复使用,即使消息被删除)。 UID 更稳定,建议在所有情况下都使用它们:x.fetch(...) -> x.uid('FETCH', ... )x.search(...) -> x.uid('SEARCH', ...)
  • 我设法用以下方法解决了这个场景:res, msg = imap.uid('search', None, 'HEADER Subject "Subject to filter"')messages = msg[0].decode('utf-8').split()for uid in messages: ` res, msg = imap.uid('fetch', uid, '(RFC822)') ` ` #parsing logic to follow ` 感谢您使用 UID 的努力和建议。 imaplib 页面上写着推荐.uid
  • 尝试使用高级库:github.com/ikvk/imap_tools
  • 感谢@Vladimir 的建议,我将在下一个项目中尝试一下。

标签: python python-3.x imaplib


【解决方案1】:

我设法通过以下方式解决了这种情况,使用推荐的方法.uid 而不是.search

imap = imaplib.IMAP4_SSL("server_to_connect_to")
imap.login(username, password)

status, messages = imap.select("INBOX",readonly=True)
imap.literal  = u'"Subject to be searched"'.encode('utf-8')
res, uid = imap.uid('SEARCH', 'CHARSET', 'UTF-8', 'SUBJECT')
messages = msg[0].decode('utf-8').split()

for uid in messages:
    res, msg = imap.uid('fetch', uid, '(RFC822)')
    #parsing logic

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多