C# 如何使用MailKit按相反顺序获取UID列表?

C# 如何使用MailKit按相反顺序获取UID列表?,c#,.net,imap,mailkit,C#,.net,Imap,Mailkit,我想使用MailKit从收件箱中获取最新的100个UID。我正在访问一个不支持排序扩展的Gmail邮箱,因此无法使用OrderBy 这是我的密码。问题是,它似乎检索到了最旧的100封电子邮件,而不是最新的(这就是我所期望的工作方式)。有办法做到这一点吗 选项A-看起来很有希望只收到100封最旧的UID电子邮件,我想要100封最新的: imap.Inbox.Open(FolderAccess.ReadOnly); var orderBy = new

我想使用MailKit从收件箱中获取最新的100个UID。我正在访问一个不支持排序扩展的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);
选项B-按日期顺序获取所有UID(但无论如何不适用于Gmail):

IMAP服务器不支持排序扩展


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

选项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);
    ...
}
IMailFolder.Fetch(int,int,MessageSummaryItems)
的工作方式是,第一个int参数是第一个消息索引,第二个参数是范围内的最后一个消息索引(
-1
是一个特例,仅表示“文件夹中的最后一条消息”)

因为一旦打开文件夹,我们就可以使用
IMailFolder.Count
属性来获取文件夹中的邮件总数,我们可以使用该属性从末尾向后计数以获取起始索引。我们想要最后100个,因此我们可以执行
folder.Count-100
。我们使用
Math.Max()


希望对您有所帮助。

如果您想单独下载每封邮件,您可以这样做

for (int i = inbox.Count-1; i > inbox.Count-101; i--)
{
    var message = inbox.GetMessage(i);
    Console.WriteLine($"Subject: {message.Subject}");
}
如果您希望在一个请求中接收所有信息,请尝试此方法

var lastHundredMessages = Enumerable.Range(inbox.Count - 100, 100).ToList();
var messages = inbox.Fetch(lastHundredMessages, MailKit.MessageSummaryItems.UniqueId);
foreach (var message in messages)
{
    //To something here with this
}

是的,这很好,非常感谢。然后,我只需通过最新的电子邮件将结果颠倒过来就可以了。是的!忘了提那件事,但你显然明白了。:-)谢谢你,快点。顺便说一下,无论我得到的是1还是500,检索UID似乎需要5秒钟。所有时间都在IMAP连接和验证中。因此,获取UID非常快,但不是登录。这就是您所期望的速度吗?这可能完全取决于服务器。由于DNS查找、网络延迟、服务器负载等原因,打开连接可能需要一段时间。可能会故意减慢身份验证速度,以降低暴力登录攻击的效率。获取UID可能非常快,因为服务器已经缓存了所有这些信息。对。这是gmail,所以很可能是为了防止暴力攻击而减速。谷歌喜欢鼓励人们使用OAuth。这大约慢了一百倍,因为它发出了一百条单一的消息请求,而不是一百条消息请求,并且它下载每个附件以突出主题。你是对的。我会更新我的答案,让我知道你的想法
var lastHundredMessages = Enumerable.Range(inbox.Count - 100, 100).ToList();
var messages = inbox.Fetch(lastHundredMessages, MailKit.MessageSummaryItems.UniqueId);
foreach (var message in messages)
{
    //To something here with this
}