EWS:从签名的电子邮件中检索附件

我有一个C#程序,通过检索附件和将电子邮件分类到子文件夹来管理资源邮箱。 最近出现了一个问题,即客户希望向我们发送已签名的电子邮件,因此当程序检索其附件时,会保存名为“smime.p7m”的文件而不是文件附件。 查看Outlook中的电子邮件时,此文件不存在,只有我们想要的附件。 但是,在单步执行代码时,Email对象中列出的附件仅包含此.p7m文件。

我从电子邮件中检索了mime内容,但它只是字节数。 当我在文本编辑器中查看.p7m文件时,我在底部文件中看到了我想要的文件的内容(最终的挑逗)! 如何获取原始附件而无需解析.p7m文件以获取感兴趣的内容?

Exchange服务器是2010 SP2,这都是通过使用EWS Managed API的C#程序实现的。

您可以使用EnvelopedCMS类从加密附件中获取MIME。 假设您的安全上下文可以访问密钥。

 byte[] content = ...The byte[] from the smime.p7m attachment ... var encrypted = new EnvelopedCms(); encrypted.Decode(content); encrypted.Decrypt(); byte[] unencryptedButRawMimeEntity = encrypted.ContentInfo.Content; 

这将允许您获取未加密的MIME实体(没有传输标头的原始电子邮件)。

请注意,如果邮件已签名,则解密的MIME实体将是另一个附件,其SMIME Type标头等于signed-data 。 您可以使用SignedCMS类重复上述过程,以公开其内容。 应该省略Decrypt调用。

然后,您必须解析/解码MIME以提取其正文和附件。

执行此操作的代码显然驻留在System.Net.Mime命名空间中,但无论出于何种原因,Microsoft都不提供公共入口点。 我在其他地方读过你可以用reflection来访问它。 这种缺点是,它不受支持,并且非公共接口在更高版本的框架中可能会发生变化。 此问题中的代码向您展示了如何处理带quoted-printable传输编码。

或者,您可以像我一样编写或借用自己的MIME解析器。 不幸的是,由于IP,我不能给你代码。

当时我无法找到一个简单的替代方案。 现在我很想尝试下面链接的NuGet包,为自己省点痛苦。 从OpenPOP.Net开始。


您可以使用此项目中的代码获取灵感,查看此问题中的第三方选项,或者在NuGet上尝试这些包 。

您应该查看MimeKit (MIME解析器+ S / MIME和PGP支持)和MailKit (如果您需要SMTP,POP3和/或IMAP)。

我已经写了一些关于如何在GitHub项目主页上的文档中使用MimeKit的解密和签名validationAPI的例子。

使用可通过NuGet和EWS Managed API访问的OpenPOP.NET,我能够检索嵌入在某个感兴趣的电子邮件的mime内容中的附件。 我用了

 System.Exchange.WebServices.Data.Item email = new System.Exchange.WebServices.Data.Item(myEmail); OpenPop.Mime.Message message = new OpenPop.Mime.Message(email.MimeContent.Content); List validMessageParts = message.FindAllAttachments().Where(x => x.FileName.Contains(".csv") == true || x.FileName.Contains(".xlsx") == true || x.FileName.Contains(".xls") == true).ToList(); foreach (MessagePart messagePart in validMessageParts) { if (messagePart != null) { using (FileStream fileStream = new FileStream(savingPath + messagePart.ContentDisposition.FileName, FileMode.Create, FileAccess.ReadWrite)) { messagePart.Save(fileStream); } } } 

将特定电子邮件中的所有csv,xlsx和xls保存到我选择的目录中。