微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 imap_tools 中使用 UID?

如何解决如何在 imap_tools 中使用 UID?

我想保存一组电子邮件的缓存,并定期验证缓存没有丢失任何 uid。我尝试的第一件事是使用 imaplib 的这种方法搜索返回邮箱的所有 UID。然后您验证所有 ID 都有一个缓存对应物。

con = imaplib.IMAP4_SSL("imap.gmail.com")
con.login(user,password)

>>> con.select('INBox')
('OK',[b'15613'])

>>> con.search(None,"TO","mail_group")
('OK',[b'13267 13277 13285 13286 13290 13306 15591 15612 15613"]

我改用 imap_tools,它也有类似的查询,但 API 更好。

con = imap_tools.MailBox('imap.gmail.com').login(user,password,initial_folder='INBox')

con.folder.status('INBox')
{'MESSAGES': 15615,'RECENT': 0,'UIDNEXT': 66119,'UIDVALIDITY': 1,'UNSEEN': 51}

>>> con.search(AND(to='mail_group'))
['15534','15557','15558','15565','15566','15567','15571','15573','15576','15579','15580','15582','15584','15588','15589','15591','15612','15613']

使用此搜索,我然后获取不在磁盘上的 ID。该帐户是审计帐户,不会删除任何消息,因此我假设这些 ID 不会更改。

我在使用 imap_tools 时遇到的问题是,当您获取搜索操作中获得的 UID 时,msg.uid 与它不匹配。

>>> msg = list(con.fetch(uid))[0]
>>> msg.uid
'66268'
>>> uid
15765

我不确定 66268 如何与 15765 连接。那么为什么 66268 是此消息的 imap_tools UID,您如何协调这两个不同的 ID?我是否以错误的方式处理这个问题?

更新:

对于 imap-tools>=0.45.0 添加了新方法:uids

解决方法

文档中的文本:首先在 rfc3501 上阅读有关 uid 的信息。我看你根本不看文档。

从主题施法者减去后更新:

(@Peter Moore:那不真实的@Vladimir,我不明白我读到了什么)

  1. 来自 lib README 的引用:

    “BaseMailBox.search - 搜索邮箱以查找匹配的邮件编号(这不是 uids)”

    这真的不明显吗?

  2. 阅读如何使用 uid。文档中提供了指向它的链接。

    这里特别适合您:https://datatracker.ietf.org/doc/html/rfc3501#section-2.3.1.1

    从那里开始:消息的唯一标识符不得在会话期间更改,并且不应在会话之间更改。

    所以,缓存 uids 是个坏主意

  3. 使用 imap-tools 获取 uid 的示例:

    uids = [i.uid for i in mailbox.fetch(headers_only=1,bulk=1)]
    
  4. 对于仅获取 uids - 使用 fetch 方法和搜索结果的 src 的一部分。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。