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

Gra*_*tel 5 c# email attachment smime ews-managed-api

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

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

交换服务器是 2010 SP2,这一切都是通过使用 EWS 托管 API 的 C# 程序发生的。

Jod*_*ell 4

您可以使用该类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;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

或者,您可以编写或借用自己的 MIME 解析器,就像我所做的那样。不幸的是,由于 IP 的原因,我无法向您提供代码。

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


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