Mimekit/mailkit下载消息正文
本文关键字:消息 正文 下载 mailkit Mimekit | 更新日期: 2023-09-27 18:12:18
我最近一直在制作自己的邮件客户端,并添加了一个接收选项,我使用mimekit和mailkit作为插件,并且能够用一个应该显示内容的阅读器下载我的大部分邮件(现在它显示主题、截止日期、起始日期(
我下载主题的方式,到。。。是msg.envelope.subject,msg.enverope.to但我不能这样下载正文:(当做msg.body、msg.textbody、msg.bodyparts时,……它们都没有结果,它应该在的地方只是空的,我无法下载它:(
有人能帮我吗?
有两种方法可以获得消息正文:
1.下载整个消息
这种方法可能是最简单的方法。
要做到这一点,你只需要打电话:
var message = folder.GetMessage (uid);
或
var message = folder.GetMessage (index);
我建议始终使用消息的UniqueId
。由于您已经在使用Fetch
方法,因此要确保您拥有消息的UniqueId
,只需在提取请求中包含MessageSummaryItems.UniqueId
即可:
var messages = folder.Fetch (0, -1, MessageSummaryItems.UniqueId |
MessageSummaryItems.Envelope | ...);
一旦你有了信息,你可以用它做任何你想做的事。
为了呈现消息,我建议查看MimeKit GitHub存储库中包含的MessageReader
示例。
它将向您展示如何正确渲染MimeMessage
。
2.只下载您需要的
这种方法有点困难,但就网络带宽使用而言,可以更高效。
您需要做的第一件事是确保在Fetch
方法中包含MessageSummaryItems.BodyStructure
位标志。例如:
var messages = folder.Fetch (0, -1, MessageSummaryItems.Envelope |
MessageSummaryItems.BodyStructure);
(您可能需要其他字段,但这只是一个示例,向您展示如何按位或一起标记以请求多个消息摘要项(。
通过请求消息的BodyStructure
,您将能够使用msg.Body
属性。
每个msg.Body
将是一个BodyPart
对象,它是一个抽象类。两个主要的子类是BodyPartMultipart
和BodyPartBasic
。您可以使用as
强制转换或is
关键字来确定它是哪一个:
var multipart = msg.Body as BodyPartMultipart;
if (multipart != null) {
// the top-level body part is a multi-part
} else {
// the body is a basic singleton part
}
这就是在BodyPartMultipart
:的子部分上迭代的方式
foreach (var part in multipart.BodyParts) {
// each part will either be a BodyPartMultipart
// or a BodyPartBasic, just like before...
}
CCD_ 18还有两个子类:CCD_ 19和CCD_ 20。BodyPartText
是基于文本的MIME部分(意味着它的MIME类型为text/*
(,而BodyPartMessage
是嵌入消息(并且将具有message/rfc822
的MIME类型(。
由于MIME是递归的,您需要实现一个递归函数来遍历MIME树结构,以找到您要查找的任何MIME部分。
为了方便起见,IMessageSummary
界面上的TextBody
和HtmlBody
属性将分别定位并返回text/plain
和text/html
身体部位。
然而,应该注意的是,这些属性仅在消息结构遵循标准约定的情况下有效(注意,我说过约定,没有正式的标准规定消息文本在MIME层次结构中的位置(。
还应该注意的是,如果您的邮件客户端将呈现HTML正文,则HTML正文部分可能是一组相关MIME部分的一部分(即multipart/related
的子部分(,但HtmlBody
属性将无法返回,因此实现自己的递归逻辑将是一个更好的选择。
有关如何执行此操作的示例,请查看MailKit GitHub存储库中的ImapClientDemo
示例。该逻辑当前位于MainWindow.cs代码中。