2017-10-17 62 views
0

我使用MailKit得到這樣充滿IMessageSummaries的列表:如何從IMessageSummary獲取MimeMessage?

var allMessages = remoteFolder.Fetch(remoteIndexList, MessageSummaryItems.Full | MessageSummaryItems.Flags | MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure); 

我沒有興趣像下載的IMessageSummary等部位的任何優化,我只是想整個數據,以最快的速度我可以得到它。

但是,使用上面的方法,我不能再讀取正確的消息主體的HTML,例如使用HtmlPreviewVisitor因爲IMessageSummaryBody屬性是BodyPartBasic。顯然,我需要整個MimeMessage

問題是,如果我想獲得多個MimeMessages,我不能,我只能使用ImapClient.GetMessage(int index, ...)方法一次得到一個。

是否有辦法從原始MimeMessage中提取所有用於創建IMessageSummary的零件,並將它們與HtmlPreviewVisitor一起使用,而無需再次下載每個完整的MimeMessage

回答

1

你需要做的是:

foreach (var item in allMessages) { 
    var message = remoteFolder.GetMessage (item.UniqueId); 
} 

IMessageSummary實際上並不包含該消息或下載的消息,它只是詢問有關該消息的元數據的各個位(如IMAP服務器消息的結構,諸如讀/未讀,發送者,主題,日期,cc,回覆等的標誌)。

如果從IMAP服務器取回各個MIME部分不感興趣,那麼你可能想使用一組簡化的MessageSummaryItemsMessageSummaryItems.All | MessageSummaryItems.UniqueId(我知道,All似乎應該包含比Full多,但是這不是IMAP別名如何工作......)。

根據您打算使用哪些數據,您甚至可以進一步減少您請求的MessageSummaryItems

例如,如果你不使用IMessageSummaryItem.Envelope屬性,那麼你不需要MessageSummaryItems.Envelope標誌並沒有要求它,你就會加快查詢,因爲IMAP服務器不會因爲多送你信息。

+0

是的,我想我應該爲每個IMessageSummary使用GetMessage(),但爲什麼不存在GetMessages()方法,它將像使用Fetch()一樣僅向IMAP服務器發送一個請求來返回消息列表? – Nevca

+0

因爲這是大量的數據將被轉儲到內存中。 – jstedfast

+0

謝謝@jstedfast – Nevca