如何访问嵌入式附件?

Posted

技术标签:

【中文标题】如何访问嵌入式附件?【英文标题】:How to access embedded attachments? 【发布时间】:2015-10-04 02:30:34 【问题描述】:

我正在使用 MailKit/MimeKit 1.2.7(最新的 NuGet 版本)。

我正在使用 ImapClient 接收可以包含不同附件(图像、文本文件、二进制文件等)的电子邮件。

MimeMessage 的 Attachment 属性帮助我访问所有这些附件 --- 除非电子邮件是通过 Apple Mail 发送的并且包含图像(Apple Mail 似乎没有使用 Content-Disposition 附加图像“附件”(阅读here ... Jeffrey Stedfast 在底部的评论)。

嵌入图像列在附件集合中。

我有哪些选择?真的要一个一个地遍历身体部位,看看里面是什么吗?还是有更简单的解决方案?

【问题讨论】:

请参阅"Should questions include “tags” in their titles?",其中的共识是“不,他们不应该”! 糟糕。对于那个很抱歉。不会再发生了。 【参考方案1】:

Working with Messages 文档列出了检查消息中 MIME 部分的几种方法,但另一个简单的选项可能是使用 MimeMessage 上的 BodyParts 属性。

首先,让我们看看MimeMessage.Attachments 属性的工作原理:

public IEnumerable<MimeEntity> Attachments 
    get  return BodyParts.Where (x => x.IsAttachment); 

正如您已经指出的,此属性不返回您正在查找的附件的原因是因为它们没有 Content-Disposition: attachment,而 MimeEntity.IsAttachment 属性正在检查这些附件。

另一个规则可能是检查文件名参数。

var attachments = message.BodyParts.Where (x => x.ContentDisposition != null && x.ContentDisposition.FileName != null).ToList ();

或者你可以说你只想要所有图片:

var images = message.BodyParts.OfType<MimePart> ().Where (x => x.ContentType.IsMimeType ("image", "*")).ToList ();

希望能给你一些关于如何获得你想要的物品的想法。

【讨论】:

是的,两个代码 sn-p 对我来说都很完美。实际上我需要两者(首先找到所有附件,然后对图像进行一些特殊处理)。谢谢你,杰弗里!这帮助很大! 警告:内联图像可能仍然没有设置内容处置。不要使用答案的第二个 sn-p

以上是关于如何访问嵌入式附件?的主要内容,如果未能解决你的问题,请参考以下文章

如何阻止电子邮件中的嵌入图像被 GMail 显示为附件?

如何使用嵌入discord.net webhook c#发送文件附件

如何使用 Outlook 2010(无 smtp)和 python 发送带有嵌入图像(不是附件)的 HTML 格式电子邮件

Python:多部分 html 电子邮件通过嵌入式图像和附件发送

嵌入式串口按键

python [Python]发送包含嵌入式图像和应用程序附件的电子邮件