当前位置: 首页 > 知识库问答 >
问题:

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

夏新翰
2023-03-14

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

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

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

共有3个答案

东郭源
2023-03-14

我花了最后 3 天的时间尝试从签名但未加密的电子邮件中提取附件。我们的项目是 vb.net 的,但将其重写为 c# 应该很容易。以下是对我有用的步骤:

  1. 安装 Mimekit Nuget 包
  2. 通过
  3. 查看其内容类型和附件名称来正确识别 S/Mime 签名的电子邮件(S/Mime 签名的电子邮件始终附加 smime.p7m 文件)
If String.Equals(origMessage.Attachments.First.ContentType, "multipart/signed", 
StringComparison.OrdinalIgnoreCase) AndAlso
String.Equals(origMessage.Attachments.First.Name, "smime.p7m", StringComparison.OrdinalIgnoreCase) Then
Dim smimeFile As FileAttachment = origMessage.Attachments.First
smimeFile.Load()
Dim memoryStreamSigned As MemoryStream = New MemoryStream(smimeFile.Content)
Dim entity = MimeEntity.Load(memoryStreamSigned)
If TypeOf entity Is Cryptography.MultipartSigned Then
    Dim mltipart As Multipart = entity
    Dim attachments As MimeEntity = mltipart(0)
    If TypeOf attachments Is Multipart Then
        Dim mltipartAttachments As Multipart = attachments
        For i As Integer = 0 To mltipartAttachments.Count - 1
            If mltipartAttachments(i).IsAttachment Then
                **'BOOM, now you're looping your attachment files one by one**
                **'Call your decode function to read your attachment as array of Bytes**
            End If
        Next
    End If
End If
'Read and decode content stream
Dim fileStrm = New MemoryStream()
mltipartAttachments(i).Content.DecodeTo(fileStrm)

Dim decodedBytes(0 To fileStrm.Length - 1) As Byte
fileStrm.Position = 0  'This is important because .DecodeTo set the position to the end!!
fileStrm.Read(decodedBytes, 0, Convert.ToInt32(fileStrm.Length))

现在你已经将你的附件文件解码为一个字节数组,你可以保存它或者做任何你想做的事情:)希望这有所帮助!

金烨华
2023-03-14

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

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

卫乐童
2023-03-14

可以使用 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实体将是另一个单独的附件,其< code>SMIME类型头等于< code >签名数据。您可以使用< code>SignedCMS类重复上述过程,以公开其内容。应该省略< code>Decrypt调用

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

完成这项工作的代码显然驻留在< code >系统中。Net.Mime命名空间,但是出于某种原因,微软没有提供它公共入口点。我在别处读到过,你不能用反射来访问它。这样做的缺点是,它不被支持,并且非公共接口在框架的后续版本中可能会改变。此问题中的代码向您展示了如何处理< code >可打印引用传输编码。

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

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

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

 类似资料:
  • 我试图从java代码中使用多部分和mime消息读取数字签名邮件,并获取附件(xml、pdf、txt等)和消息细节。我的代码适用于内容类型为:multipart/signed的邮件;Protocol=“申请/X-PKCS7-签名”;但是很少有邮件的内容类型为:application/pkcs7-mime;smime-type=signed-data;name=smime.p7m它没有获取附件和消息详

  • 问题内容: 我正在使用sendgrid发送电子邮件,并且使用以下代码可以正常工作,但没有附件。 但是我需要发送附件,因此我搜索了github源和Web文档API,由于某种原因,没有javadocs,但是有一个示例GitHub sendgrid, 所以我一直在尝试直到它起作用为止,我缩小了一些异常和响应代码,起初我是被禁止的未经授权,最好是响应202,表示有效且已排队(在此处检查),这是我的代码发送

  • 我想出了一个解决办法,就是导入所有用户的电子邮件文件夹。这个解决方案是工作的,它只是繁琐的维护,因为我们几乎每周都有新的/删除的用户。

  • 问题内容: 我必须在电子邮件签名中包含一些图像(公司徽标等)。使用问题电子邮件系统生成的嵌入图像(通常以附件形式发送)和链接图像(需要获得许可才能在收到的电子邮件中显示它们)时,我遇到了各种各样的问题。 我刚刚从交易所收到了一些电子邮件,这些电子邮件具有徽标的base64图像表示形式,并使用标签进行显示。我正在寻找有关如何在可能的情况下通过电子邮件签名执行此操作的信息(我如何生成徽标的base64

  • 我想从一个邮箱中搜索名字中包含某些关键字的所有附件,我正在使用C#EWS托管API(2.2版)来完成这一操作。我可以使用Item.hasAttachment:true属性访问带有附件的项,并且代码按预期工作。但办理时间很长。 我需要知道是否有一个更好更快的方法来访问一个邮箱/文件夹中的附件使用EWS。不是检查每一个邮件项目,有没有一种方法应用过滤器的附件在文件夹级别? 下面是用于按name关键字提

  • 目前,我的代码使用IMAP(imaps)和JavaMail访问我的Gmail收件箱,目的是阅读从最新到最旧发送给我自己的电子邮件,识别哪些电子邮件具有. zip或. xap格式的附件。如果找到,电子邮件的主题会显示出来,并询问我是否要下载附件。 如果我单击否,它会继续搜索。如果我单击是,它会调用createFolder方法来创建一个目录,将附件保存在那里,然后提取它。 问题:我收件箱中最近的一封电

  • 我正在尝试使用Swift从iOS中的google登录API中查找登录帐户的电子邮件。我使用的代码与google开发者说明页面中给出的代码相同。 这是我的密码 description=[NSString stringAnd Format: @"%@ %@ %@ %@ %@ %@", person.display名称,person.gender,person.ageRange.min,person.a