c# - Mimekit/mailkit 下载邮件正文?

标签 c# mailkit mimekit

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

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

谁能帮帮我?

最佳答案

获取消息正文有2种方式:

<强>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 | ...);

收到消息后,您可以随心所欲地使用它。

为了呈现消息,我建议您查看 MessageReader样本包含在 MimeKit 中GitHub 存储库。

它将向您展示如何正确渲染 MimeMessage .

<强>2。只下载您需要的内容

这种方法有点难,但可以就网络带宽使用而言更有效。

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

var messages = folder.Fetch (0, -1, MessageSummaryItems.Envelope | 
    MessageSummaryItems.BodyStructure);

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

通过请求 BodyStructure在这些消息中,您将能够使用 msg.Body属性(property)。

每个msg.Body将是 BodyPart object 是一个抽象类。 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
}

这是迭代 BodyPartMultipart 的子部分的方式:

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

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

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

为了您的方便,TextBodyHtmlBody IMessageSummary 上的属性接口(interface)将定位并返回 text/plaintext/html body 部位,分别。

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

还应注意,如果您的邮件客户端将呈现 HTML 正文,则 HTML 正文部分可能是一组相关 MIME 部分的一部分(即 multipart/related 的子项),但 HtmlBody property 将无法返回它,因此实现您自己的递归逻辑将是更好的选择。

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

关于c# - Mimekit/mailkit 下载邮件正文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32529909/

相关文章:

c# - DateTime 应该存储在世界各地都可以访问的网站中的 UTC 时间还是(服务器的)本地时间

c# - 如何通过点击按钮传递参数

c# - 添加 Imap 文件夹 Mailkit

Mailkit IMAP gmail - 如何发送?在线 Doumentation 没有显示如何发送示例

c# - Mailkit:发送草稿

c# - Node.js 到 C# 转换

c# - 使用委托(delegate)执行任何方法并重试 1 次的通用方法

c# - 在 mailkit imap 中仅显示附件链接

outlook - 特定用户使用 MailKit 向 Office 365 Outlook IMAP 进行身份验证失败

c# - 如何在 C# 中使用 MimeKit 发送电子邮件