【问题标题】:Check for changes/new messages in IMAP4?检查 IMAP4 中的更改/新消息?
【发布时间】:2014-05-08 22:31:48
【问题描述】:

我基本上想做与这个问题中所问的内容相同的事情:How to retrieve only new emails using POP3 protocol 但对于 IMAP4 而不是 POP3,所以前提相同但答案完全不同。

如果我之前已经下载了所有邮件标头和 UID 等,并且可以使用这些信息,我如何有效地找出哪些邮件是新的/更改的/删除的,这样我就可以下载这些邮件而无需重新- 下载所有看到的消息?

目前,我为每个本地消息 ID FETCHing UID 并查看是否有任何 UID 是新的或丢失的,然后 FETCHing RFC822 为每个新的 UID 数据。但在实践中,这似乎非常慢,所以我想看看是否能找到一种更有效的方法来识别新的/更改的消息。

Sent 5/7/2014 9:42:08 AM: C5 FETCH 1 (UID)<EOL>
Recv 5/7/2014 9:42:08 AM: * 1 FETCH (UID 46987)<EOL>C5 OK Fetch completed.<EOL>
Sent 5/7/2014 9:42:08 AM: C6 FETCH 2 (UID)<EOL>
Recv 5/7/2014 9:42:08 AM: * 2 FETCH (UID 46989)<EOL>C6 OK Fetch completed.<EOL>

我一直在查看 [RFC for IMAP][1],看起来可能有一些命令听起来可能相关(例如RECENT),但我对 ins 和走出 IMAP 以确保我在正确的轨道上。 [1]:https://www.rfc-editor.org/rfc/rfc3501#section-7.2.4

【问题讨论】:

    标签: imap


    【解决方案1】:

    使用FETCH 范围为[$lastSeenHighestUID+1]:*,根据RFC 3501 中的此评论:

    注意:下一个唯一标识符值旨在 为客户提供一种方法来确定是否有任何 邮件已发送到邮箱,因为 上次它检查了这个值。它不是为了 提供任何保证任何消息都会有这个 唯一标识符。客户当时只能假设 它获得下一个唯一标识符值,即 在该时间之后到达的消息将具有更大的 UID 大于或等于该值。

    因此,如果您上次看到的最高 UID 是 242,那么您将获取 243:*。

    RECENT 是not terribly reliable,因为第一个客户端会看到标志然后删除标志。如果您的代码是倒霉的第二个(或第 n 个 >= 2),那么您永远不会知道该消息是最近的。

    【讨论】:

    • 所以这只是提供新消息,对吗?它不会让您知道其他客户端应用程序删除的消息?
    • 并且使用 UID 范围,服务器可以同时告诉你所有条消息。
    • 第一个访问邮箱的客户端将删除最近标记,没有“可能”。了解哪些消息已被删除的一种方法是获取已缓存并将显示的消息,然后发出“uid search uid 1000,1002,1005”(假设 UID 1001、1002 和 1005 是您计划从缓存中显示的那些)。然后服务器会告诉您这三条消息中的哪一条没有被删除。
    • 我想你的意思是:“所以如果你最后看到的最高 UID 是 242,那么你会获取 243:*。” (获取时使用 lastseenuid + 1)
    • @Gigi:否定。不能保证 last + 1 会存在。
    猜你喜欢
    • 2015-12-13
    • 2015-10-02
    • 1970-01-01
    • 2012-03-21
    • 2014-12-17
    • 2019-12-28
    • 2017-10-03
    • 2014-11-24
    • 1970-01-01
    相关资源
    最近更新 更多