如何从 IMessageSummary 获取 MimeMessage?

How to get MimeMessage from IMessageSummary?

我正在使用 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, ...)方法一次获取一个

有没有办法从用于创建 IMessageSummary 的原始 MimeMessage 中提取所有部分并将它们与 HtmlPreviewVisitor 一起使用,而无需下载每个完整的 MimeMessage 又是?

您需要做的是:

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

IMessageSummary实际上并不包含消息或下载消息,它只是向 IMAP 服务器询问有关消息的各种元数据(例如消息的结构、标志等read/unread、发件人、主题、日期、收件人、抄送、回复等)。

如果您对从 IMAP 服务器获取单个 MIME 部分不感兴趣,那么您可能希望使用缩减的 MessageSummaryItems 集,例如 MessageSummaryItems.All | MessageSummaryItems.UniqueId(我知道,All 似乎它应该包含超过 Full,但这不是 IMAP 别名的工作方式......)。

根据您计划使用的数据,您甚至可以进一步减少请求的 MessageSummaryItems

例如,如果您不使用 IMessageSummaryItem.Envelope 属性,那么您就不需要 MessageSummaryItems.Envelope 标志并且不请求它,您将加快速度查询,因为 IMAP 服务器不会向您发送那么多信息。