【问题标题】:MailKit search IMAP email came after specific UIDMailKit 搜索 IMAP 电子邮件出现在特定 UID 之后
【发布时间】:2016-05-01 21:40:21
【问题描述】:

我正在使用 MailKit .net 库从 gmail 获取电子邮件。

根据Getting only new mail from an IMAP serverIMAP: Search for messages with UID greater than X (or generally, after my last search)

我想搜索最后一次记住 UID 之后的所有电子邮件。假设获取的最后一条消息的唯一 ID 为“123456”。我要搜索

123456:*

如何在 MailKit 中实现这种搜索?

【问题讨论】:

    标签: c# imap mailkit


    【解决方案1】:

    MailKit 中的 ImapFolder 上有多个 Search 方法重载。您需要使用带有 IList<UniqueId> 参数的重载之一。

    鉴于此,现在您需要创建要搜索的 UID 列表。我建议查看 MailKit 命名空间中的 UniqueIdRange 类。

    如果您的客户端程序在上一个会话中看到的最后一个 UID 是 123456,那么您实际上希望您的搜索以 UID 123457 开始。在 IMAP 中,* 只是“文件夹中最大唯一 ID 值”的通配符。在 MailKit 中,您可以使用 UniqueId.MaxValue

    var range = new UniqueIdRange (new UniqueId ((uint) 123457), UniqueId.MaxValue);
    

    现在您有了123457:* 范围,您可以执行搜索:

    foreach (var uid in folder.Search (range, query)) {
        var message = folder.GetMessage (uid);
    }
    

    【讨论】:

    • 搜索(范围,查询)中的查询应该有什么? range 本身不是一个查询,那为什么我们需要传递额外的参数呢?
    • range 本身并不是一个查询,它只是应用您的搜索查询的消息子集。如果您想要该范围内的所有消息,那么您将使用 SearchQuery.All 作为您的查询。
    • 如果我使用 SearchQuery.All,它会从服务器检索所有 UID 到客户端吗?之后,它会过滤到范围子集(在客户端)?我的目标是尽量减少数据传输。我只需要在我处理的最后一个 UID 之后出现 UID。如果我从服务器检索所有 UID,然后我忽略 UID 少于我处理的最后一个 UID,也可以这样做。我认为 folder.Search (range, query) 应该在服务器端执行完整的过滤操作(范围和查询)。
    • 不,服务器只会返回范围内消息的 IUD。不相信我?检查 IMAP 协议日志。
    • SearchQuery.All 只会匹配指定范围内的消息,正如我的回答所解释的那样。我给你的答案将产生可能的绝对最小流量。相信我,我知道我在说什么。
    猜你喜欢
    • 2015-06-09
    • 1970-01-01
    • 2020-06-18
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-28
    • 2012-02-27
    相关资源
    最近更新 更多