【问题标题】:How to get message body without downloading attachment如何在不下载附件的情况下获取邮件正文
【发布时间】:2014-05-18 13:27:31
【问题描述】:

我正在使用名为:MailKit 的 IMAP4 客户端。 它工作得很好,但我在不下载附件的情况下获取邮件正文时遇到问题。我想显示邮件的正文以及有哪些附件, 但只有当用户点击附件时,我才想实际下载附件。

我试过了:

var message = inbox.GetMessage(uid, cancel.Token);

但这得到了整个消息。

也试过了:

uids[0] = uid;
var ms = inbox.Fetch(uids, MessageSummaryItems.BodyStructure , cancel.Token);  
var bp1 = inbox.GetBodyPart(uid, ms.First().Body, cancel.Token);

但这又会下载附件。

【问题讨论】:

  • 这看起来很合理。实际发出的 IMAP 命令是什么?
  • 听起来您应该在他们自己的论坛中为您的特定库 (MailKit) 寻求支持。

标签: c# .net imap mailkit


【解决方案1】:

使用您的示例代码,您正在下载整个消息,因为您正在请求消息的顶级正文部分。

MIME 是“身体部位”的树形结构。你要做的是遍历 ms.First().Body 找到你想要的部分,然后使用 GetBodyPart() 方法单独下载它们。

看看 MailKit.BodyPartMultipart、MailKit.BodyPartMessage、MailKit.BodyPartBasic 和 MailKit.BodyPartText。

BodyPartMultipart 包含其他身体部位。

BodyPartMessage 部分包含一条消息(也将包含一个正文部分)。

BodyPartBasic 是基本的叶节点主体部分 - 通常是“附件”。

BodyPartText 是一个文本部分(BodyPartBasic 的子类),它可以是附加的文本部分,也可以是您可能认为是消息的主要文本。

要确定 BodyPartBasic 是内联显示还是作为附件显示,您需要做的是:

if (part.ContentDisposition != null && part.ContentDisposition.IsAttachment)
    // it is an attachment
else
    // it is meant to be shown to the user as part of the message
    // (if it is an image, it is meant to be displayed with the text)

我可能应该在 BodyPartBasic 中添加一个名为 IsAttachment 的便利属性,以使其更简单一些(我今天会尝试添加它)。

希望对您有所帮助。

更新:我刚刚在 git master 中添加了 BodyPartBasic.IsAttachment 便利属性,所以下一个版本的 MailKit 会有它。

【讨论】:

  • 不客气!顺便说一句,我还添加了在 git master 中指定是否需要 headersOnly 的功能
【解决方案2】:

此 IMAP 命令将只返回文本正文。

     a1 uid fetch <uid> (body.peek[text])

-瑞克

【讨论】:

    猜你喜欢
    • 2016-12-03
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 2022-06-10
    相关资源
    最近更新 更多