簡體   English   中英

如何使用MailKit以相反的順序獲取UID列表?

[英]How to get a list of UIDs in reverse order with 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);

選項 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 擴展。

原因是快速掃描郵箱以提高對用戶的響應能力。

您在選項 A 中非常接近,您只是對前 2 個參數使用了錯誤的值。

這就是你想要的:

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 如果文件夾中的郵件數小於 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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM