问题描述
我正在使用 Mailkit,并且想要获取所有 UniqueId 大于指定值的邮件。
根据接受的答案 here,“如果您的客户端程序在前一个会话中看到的最后一个 UID 是 123456,您实际上希望您的搜索以 UID 123457 开始",所以我应该使用这样的代码......
var range = new UniqueIdRange (new UniqueId ((uint) 123457),UniqueId.MaxValue);
嗯,我就是这样做的,但是当我这样做时返回的 ID 列表......
var uids = inBox.Search(range,SearchQuery.All).ToList();
包括文件夹中最后一条消息的 ID,即使它小于 123457。换句话说,搜索包括 123456。
似乎只有在 123456 之后没有任何新消息时才会发生这种情况。如果有,则 123456 将不会包含在返回的 ID 列表中。
我在这里做错了吗?我复制的代码是包作者自己贴出来的,所以我想应该是正确的。那为什么我会得到一个我已经拥有的 ID?如果没有任何 ID 大于 123456 的消息,我会期望 Search
返回一个空列表。
谢谢
解决方法
IMAP 规范中有一些关于消息范围的微妙之处。
首先,a:b
和 b:a
是相同的:a 和 b 的 id 之间的所有消息,以任一顺序。最小的数字是第一还是第二并不重要。 2:5
和 5:2
是同一个意思。
其次,*
UID 表示“当前文件夹中最大的数字”,因此如果您的最大消息是 20,则表示 20。
合并,这意味着如果您搜索 123457:*
并且 123456
是您最大的消息,这意味着您搜索的是 123457:123456
,这意味着从 123456 到 123457 的任何消息。因为这包括你的最后一条消息,它被返回。你应该把它过滤掉。
如果您有新消息,例如您的最高消息现在是 123460,则搜索表示 123457:123460
,它会执行您想要的操作。