Mimekit/mailkit下载邮件正文?

use*_*889 4 c# mailkit mimekit

我最近一直在制作自己的邮件客户端,并添加了一个接收选项,我使用mimekit和mailkit作为插件,并且能够使用应该显示内容的阅读器下载我的大部分邮件(现在它显示主题,来自,来自, ,日期)

我下载主题的方式是,...是msg.envelope.subject,msg.envelope.to但我无法下载这样的主体:(当做msg.body,msg.textbody,msg.bodyparts ,. ..他们都导致了NOTHING,它应该是空的地方,我无法下载:(

谁能帮我?

jst*_*ast 5

获取邮件正文有两种方法:

1.下载整个消息

这种方法可能是最简单的方法.

要做到这一点,您需要做的就是致电:

var message = folder.GetMessage (uid);
Run Code Online (Sandbox Code Playgroud)

要么

var message = folder.GetMessage (index);
Run Code Online (Sandbox Code Playgroud)

我建议总是使用UniqueId该消息.由于您已经在使用该Fetch方法,因此您只需要在获取请求中UniqueId包含该消息,您需要做的就是MessageSummaryItems.UniqueId:

var messages = folder.Fetch (0, -1, MessageSummaryItems.UniqueId |
    MessageSummaryItems.Envelope | ...);
Run Code Online (Sandbox Code Playgroud)

收到消息后,您可以随心所欲地做任何事情.

为了呈现消息,我建议您查看MimeKit GitHub存储库中MessageReader包含的示例.

它将向您展示如何正确呈现MimeMessage.

2.仅下载您需要的内容

这种方法有点困难但可以网络带宽的使用而言可能更有效.

您需要做的第一件事是确保MessageSummaryItems.BodyStructureFetch方法中包含位标志.例如:

var messages = folder.Fetch (0, -1, MessageSummaryItems.Envelope | 
    MessageSummaryItems.BodyStructure);
Run Code Online (Sandbox Code Playgroud)

(您可能需要其他字段,但这只是一个示例,向您展示如何按位或标记一起请求多个消息摘要项).

通过请求BodyStructure消息,您将能够使用该msg.Body属性.

每个都是一个抽象类msg.BodyBodyPart对象.2个主要的子类是BodyPartMultipartBodyPartBasic.您可以使用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
}
Run Code Online (Sandbox Code Playgroud)

这是你如何迭代a的子部分BodyPartMultipart:

foreach (var part in multipart.BodyParts) {
    // each part will either be a BodyPartMultipart
    // or a BodyPartBasic, just like before...
}
Run Code Online (Sandbox Code Playgroud)

还有2个子类BodyPartBasic是:BodyPartTextBodyPartMessage.A BodyPartText是基于文本的MIME部分(意味着它具有MIME类型text/*),而a BodyPartMessage是嵌入式消息(并且具有MIME类型message/rfc822).

由于MIME是递归的,因此您需要实现一个递归函数来遍历MIME树结构以查找您要查找的任何MIME部分.

为了您的方便,TextBody并且HtmlBody在性能上的IMessageSummary接口将定位并返回text/plain,并text/html分别身体部位.

但是应该注意,这些属性仅适用于消息结构遵循标准约定的情况(注意我所说的约定,没有正式标准规定消息文本在MIME层次结构中的位置).

还应该注意的是,如果您的邮件客户端将呈现HTML正文,则HTML正文部分可能是一组相关MIME部分(即a的子节点multipart/related)的一部分,但该HtmlBody属性将无法返回该部分和所以实现自己的递归逻辑将是一个更好的选择.

有关如何执行此操作的ImapClientDemo示例,请查看MailKit GitHub存储库中的示例.逻辑当前位于MainWindow.cs代码中.