IMAP:搜索 UID 大于 X 的邮件(或者通常,在我上次搜索之后)

Posted

技术标签:

【中文标题】IMAP:搜索 UID 大于 X 的邮件(或者通常,在我上次搜索之后)【英文标题】:IMAP: Search for messages with UID greater than X (or generally, after my last search) 【发布时间】:2012-02-27 04:17:50 【问题描述】:

我正在编写一个脚本来分析我的邮箱并希望定期检查新邮件。搜索条件是:给我 UID 大于 X 的所有电子邮件的 UID,其中 X 是我处理的最后一封电子邮件的 UID。

或者,更一般地说,我正在寻找一种仅查看自上次搜索以来的消息的方法。

请注意,我不是在寻找可见/不可见的消息;该脚本以只读方式打开邮箱,我希望它不会干扰我的标志等。

我知道我可以在 IMAP 搜索中指定一个日期,但它的粒度似乎是按天计算的,所以不完全是我需要的。

我开始使用 Gmail 作为 IMAP 服务器,但希望将来支持通用 IMAP 服务器。

有没有办法搜索 UID 大于 X 的电子邮件?还是另一种指定自消息 X 以来的所有消息的方法?

【问题讨论】:

【参考方案1】:

您可以对 UID 使用 IMAP SEARCH。假设您最近获取的 UID 是 1999 年,我认为您会这样做:

SEARCH UID 2000:*

【讨论】:

应该被接受的答案。也不确定我是否清楚地理解了 RFC:我们是否 100% 确定给定的 UID 永远不会随着时间的推移再次被使用? (电子邮件删除等) @lajarre 这不是我理解的内容,无法完全回答。如果您将其作为 *** 上的一个单独问题提出,您可能会得到更好的答案。根据 RFC 3501 第 2.3.1.1 节,UID“不得在会话期间更改,也不应在会话之间更改”以及对 UID 的更改“必须使用 UIDVALIDITY 机制检测” @SimonMayer 我真的读完了,这取决于服务器的实现...... 只是想补充一点,“另外请注意,559:* 的 UID 范围始终包括邮箱中最后一封邮件的 UID,即使 559 高于任何分配的 UID 值。这是因为范围的内容与范围端点的顺序无关。因此,任何以 * 作为端点之一的 UID 范围都表示至少有一条消息(具有最高 UID 编号的消息),除非邮箱为空。 有一个叫做 UIDVALIDITY 的东西决定了 UID 是否可以被重用。简而言之:只要邮箱的 UIDVALIDITY 不变,UID 就不能重复使用。【参考方案2】:

为什么不为此使用 IMAP IDLE?

使用 IMAP IDLE,每次有新消息到达时服务器都会向您发出警告

【讨论】:

因为没有被广泛支持。你必须保持联系? @benchpresser 恢复旧线程的方式:) - 无论如何,你说的都是真的,但到第一点我说“这就是为什么我问是否有理由不使用 OP 的具体情况” ,至于第二个,如果你没有连接你就不能真正搜索邮箱 但是如果您昨天连接并今天重新连接,则您已连接并再次连接,但无法使用 IDLE。此外,如果您的应用程序需要对间歇性网络中断保持稳健,您需要跟踪客户端。所以是的,如果您可以支持 IDLE,那么如果对您有意义,请支持 IDLE,但这并不能解决一般情况下的问题;并且通常您需要支持一般情况,即使您确实想尽可能使用 IDLE。 令人失望的是,从 Python 3.5 开始,imaplib 甚至不支持 IDLE,但是有 work in progress for 3.6,并且您可以同时使用第三方原型; github.com/athoune/imapidle

以上是关于IMAP:搜索 UID 大于 X 的邮件(或者通常,在我上次搜索之后)的主要内容,如果未能解决你的问题,请参考以下文章

Python 3:通过 uid (imaplib) 将电子邮件移至垃圾箱

将*单个* IMAP 邮件标记为未读

Python IMAP 从或到指定的电子邮件地址搜索

在 Ruby Net::IMAP 中选择邮箱“已发送邮件”或“所有邮件”

python和imaplib:如何在给定电子邮件ID的情况下下载附件文件

在 python 中解析 IMAP 响应