如何访问嵌入式附件?
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以上是关于如何访问嵌入式附件?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用嵌入discord.net webhook c#发送文件附件
如何使用 Outlook 2010(无 smtp)和 python 发送带有嵌入图像(不是附件)的 HTML 格式电子邮件