如何解决如何在 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,我不明白我读到了什么)
-
来自 lib README 的引用:
“BaseMailBox.search - 搜索邮箱以查找匹配的邮件编号(这不是 uids)”
这真的不明显吗?
-
阅读如何使用 uid。文档中提供了指向它的链接。
这里特别适合您:https://datatracker.ietf.org/doc/html/rfc3501#section-2.3.1.1
从那里开始:消息的唯一标识符不得在会话期间更改,并且不应在会话之间更改。
所以,缓存 uids 是个坏主意
-
使用 imap-tools 获取 uid 的示例:
uids = [i.uid for i in mailbox.fetch(headers_only=1,bulk=1)]
-
对于仅获取 uids - 使用 fetch 方法和搜索结果的 src 的一部分。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。