我最近一直在制作自己的邮件客户端并添加了一个接收选项,我使用mimekit和mailkit作为插件,并且能够使用应该显示内容的阅读器下载我的大部分邮件(现在它显示主题,来自,日期)
我下载主题的方式是,...是msg.envelope.subject,msg.envelope.to 但是我无法下载这样的身体:(当做msg.body,msg.textbody,msg.bodyparts,......他们都导致了NOTHING,它应该是空的地方,我无法得到它下载:(
任何人都可以帮助我吗?
答案 0 :(得分:5)
有两种获取邮件正文的方法:
<强> 1。下载整个消息
这种方法可能是最简单的方法。
要做到这一点,您需要做的就是致电:
var message = folder.GetMessage (uid);
或
var message = folder.GetMessage (index);
我建议始终使用邮件的UniqueId
。由于您已经在使用Fetch
方法,因此您需要做的就是确保邮件的UniqueId
包含{f获取请求中的MessageSummaryItems.UniqueId
:
var messages = folder.Fetch (0, -1, MessageSummaryItems.UniqueId |
MessageSummaryItems.Envelope | ...);
收到消息后,您可以随心所欲地做任何事情。
为了呈现消息,我建议您查看MimeKit GitHub存储库中包含的MessageReader
示例。
它将向您展示如何正确呈现MimeMessage
。
<强> 2。仅下载您需要的内容
这种方法有点困难,但可以在网络带宽使用方面更高效。
您需要做的第一件事是确保在MessageSummaryItems.BodyStructure
方法中包含Fetch
位标志。例如:
var messages = folder.Fetch (0, -1, MessageSummaryItems.Envelope |
MessageSummaryItems.BodyStructure);
(您可能想要其他字段,但这只是一个示例,向您展示如何一起按位或标记请求多个消息摘要项目。)
通过请求BodyStructure
消息,您将能够使用msg.Body
属性。
每个msg.Body
都是一个BodyPart
对象,它是一个抽象类。 2个主要子类是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...
}
BodyPartBasic
还有两个子类:BodyPartText
和BodyPartMessage
。 BodyPartText
是基于文本的MIME部分(意味着它具有MIME类型text/*
)而BodyPartMessage
是嵌入式消息(并且其MIME类型为{{} 1}})。
由于MIME是递归的,因此您需要实现递归函数来遍历MIME树结构以查找您要查找的任何MIME部分。
为方便起见,message/rfc822
界面上的TextBody
和HtmlBody
属性将分别找到并返回IMessageSummary
和text/plain
正文部分。< / p>
然而,应该注意的是,这些属性仅适用于消息结构遵循标准约定的情况(通知我说约定,没有正式的标准规定了MIME层次结构中的消息文本。)
还应该注意,如果您的邮件客户端将呈现HTML正文,则HTML正文部分可能是一组相关MIME部分(即text/html
的子集)的一部分,但{ {1}}属性将无法返回,因此实现自己的递归逻辑将是更好的选择。
有关如何执行此操作的示例,请查看MailKit GitHub存储库中的multipart/related
示例。逻辑当前位于MainWindow.cs代码中。