如何使用MailKit以相反的顺序获取UID列表?

mik*_*son 1 .net c# imap mailkit

我想使用MailKit从收件箱中获取最新的100个UID.我正在访问一个似乎不支持SORT扩展程序的Gmail邮箱,因此我无法使用OrderBy.

这是我的代码.问题是它似乎检索最旧的100封电子邮件而不是最新的电子邮件(这是我期望它的工作方式).有没有办法做到这一点?

选项A - 看起来很有希望只获得100个最旧的电子邮件UID,我想要100个最新的:

            imap.Inbox.Open(FolderAccess.ReadOnly);
            var orderBy = new [] { OrderBy.ReverseArrival };
            var items = imap.Inbox.Fetch(0, limit, MessageSummaryItems.UniqueId);
Run Code Online (Sandbox Code Playgroud)

选项B - 按日期顺序获取所有 UID(但无论如何都不适用于Gmail):

            imap.Inbox.Open(FolderAccess.ReadOnly);
            var orderBy = new [] { OrderBy.ReverseArrival };
            SearchQuery query = SearchQuery.All;
            var items = imap.Inbox.Search(query, orderBy);
Run Code Online (Sandbox Code Playgroud)

IMAP服务器不支持SORT扩展.

原因是快速扫描邮箱以提高对用户的响应能力.

jst*_*ast 8

你在选项A中非常接近,你只是对前两个参数使用了错误的值.

这就是你想要的:

imap.Inbox.Open (FolderAccess.ReadOnly);
if (imap.Inbox.Count > 0) {
    // fetch the UIDs of the newest 100 messages
    int index = Math.Max (imap.Inbox.Count - 100, 0);
    var items = imap.Inbox.Fetch (index, -1, MessageSummaryItems.UniqueId);
    ...
}
Run Code Online (Sandbox Code Playgroud)

有效的方法IMailFolder.Fetch (int, int, MessageSummaryItems)是第一个int参数是第一个消息索引,第二个参数是范围中的最后一个消息索引(这-1是一个特殊情况,仅表示"文件夹中的最后一条消息").

因为一旦我们打开文件夹,我们就可以使用该IMailFolder.Count属性来获取文件夹中的消息总数,我们可以使用它来从末尾向后计数以获得我们的起始索引.我们想要最后100个,所以我们可以做到folder.Count - 100.我们Math.Max()用来确保如果文件夹中的消息数小于100,我们就不会得到负值.

希望有所帮助.