我使用MailKit获取完整的IMessageSummaries列表,如下所示:
var allMessages = remoteFolder.Fetch(remoteIndexList, MessageSummaryItems.Full | MessageSummaryItems.Flags | MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure);
我对下载IMessageSummary等部分的任何优化都不感兴趣,我只想要整个数据,尽可能快地得到它。
但是使用上述方法,我无法正确阅读邮件正文中的HTML,例如使用HtmlPreviewVisitor
,因为Body
属性IMessageSummary
是BodyPartBasic
。我显然需要整个MimeMessage
。
问题在于,如果我想获得多个MimeMessages
,我就不能,我只能使用ImapClient.GetMessage(int index, ...)
方法一次获得一个。
有没有办法从用于创建MimeMessage
的原始IMessageSummary
中提取所有部分,并将其与HtmlPreviewVisitor
一起使用,而无需下载每个MimeMessage
GPlusMgr::Get().GetGameServices()->Snapshots().Open(gpg::DataSource::CACHE_OR_NETWORK, Filename.ToASCII(), gpg::SnapshotConflictPolicy::MANUAL, [this](gpg::SnapshotManager::OpenResponse res)
{
if (res.conflict_id != "")
{
// Do scary conflict resolution dance.
}
else
{
// No conflict, just save to cloud.
}
再次?
答案 0 :(得分:2)
您需要做的是:
foreach (var item in allMessages) {
var message = remoteFolder.GetMessage (item.UniqueId);
}
IMessageSummary
实际上并不包含消息或下载消息,它只是向IMAP服务器询问有关消息的各种元数据(例如消息的结构,诸如read /之类的标志)未读,发件人,主题,日期,到,抄送,回复等)。
如果您不想从IMAP服务器获取单个MIME部分,那么您可能希望使用简化的MessageSummaryItems
集合,例如MessageSummaryItems.All | MessageSummaryItems.UniqueId
(我知道,All
似乎它应该包含超过Full
,但这不是IMAP别名的工作原理......)。
根据您计划使用的数据,您甚至可以进一步减少所请求的MessageSummaryItems
。
例如,如果您不使用IMessageSummaryItem.Envelope
属性,那么您不需要MessageSummaryItems.Envelope
标志,并且不请求它,您将加速查询,因为IMAP服务器不会向你发送尽可能多的信息。