5

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

我将主题下载到...的方式是 msg.envelope.subject, msg.envelope.to 但我不能像这样下载正文:(当执行 msg.body、msg.textbody、msg.bodyparts 时。 ..它们都没有结果,它应该是空的地方,我无法下载它:(

谁能帮我?

4

1 回答 1

8

获取消息体的方法有两种:

1. 下载整个消息

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

为此,您需要做的就是调用:

var message = folder.GetMessage (uid);

或者

var message = folder.GetMessage (index);

我建议始终使用UniqueId消息的 。由于您已经在使用该Fetch方法,因此您需要做的就是确保您拥有UniqueId消息的 ,将 包含MessageSummaryItems.UniqueId在您的 fetch 请求中:

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.BodyBodyPart两个主要子类是BodyPartMultipartBodyPartBasic。您可以使用ascast 或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
}

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

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

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

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

为方便起见,界面上的TextBodyHtmlBody属性将分别定位和返回和正文部分。IMessageSummarytext/plaintext/html

然而,应该注意的是,这些属性仅在消息结构遵循标准约定的情况下才有效(注意我说的是约定,没有正式的标准规定消息文本在 MIME 层次结构中的位置)。

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

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

于 2015-09-14T00:45:07.603 回答