我想使用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);
选项B - 按日期顺序获取所有 UID(但无论如何都不适用于Gmail):
imap.Inbox.Open(FolderAccess.ReadOnly);
var orderBy = new [] { OrderBy.ReverseArrival };
SearchQuery query = SearchQuery.All;
var items = imap.Inbox.Search(query, orderBy);
IMAP服务器不支持SORT扩展名。
原因是快速扫描邮箱以提高对用户的响应能力。
答案 0 :(得分:7)
你在选项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()
来确保如果文件夹中的邮件数量少于100,我们就不会得到负值。
希望有所帮助。
答案 1 :(得分:2)
如果你想单独下载每条消息,你可以做一些简单的事情。
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
}