【问题标题】:Getting attachments of a S/MIME signed mail获取 S/MIME 签名邮件的附件
【发布时间】:2018-08-22 07:37:56
【问题描述】:

我正在尝试通过 microsoft-graph-api 获取签名邮件的附件。

我在这个 URL 上使用 GET-Request

https://graph.microsoft.com/v1.0/me/messages/AAMkAG.../attachments

这应该返回指定邮件的对象列表。每个对象都包含一个附件的“name”和“contentType”等元数据,以及包含附件内容的“contentBytes”属性。附件为base64-string

如果邮件没有附件,则此列表为空。

到目前为止,这对未通过S/MIME 签名的每封邮件都有效。
但是,如果邮件是用S/MIME 签名的,我会在响应列表中得到奇怪的结果。

无论邮件有多少附件,响应列表都只包含一个元素。然后,此元素带有名称“smime.p7m”和内容类型“multipart/signed”,而 contentBytes 属性几乎包含邮件的整个 MIME,而不是内容的单个附件。

我无法想象这是理想的行为,所以我问:

这是 microsoft-graph-api 中的错误,还是我在请求中做错了什么?如果是,我该如何解决?

【问题讨论】:

  • 嗨@Maxelhead。您是否设法编写代码?我也有同样的问题。

标签: microsoft-graph-api


【解决方案1】:

这可能与您的问题有点无关,但我过去 3 天尝试从 签名但未加密的电子邮件中提取附件。希望这对处于类似情况的人有所帮助。 以下是在 vb.net 中对我有用的步骤:

  1. 安装Mimekit Nuget Package
  2. 通过查看其内容类型和附件名称来正确识别 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
  1. 将 smime 文件加载为 EWS FileAttachment 并从中创建新的 memoryStream。然后创建此流的 MimeKit.MimeEntity。现在你正在使用非常适合这些东西的 MimeKit 库
Dim smimeFile As FileAttachment = origMessage.Attachments.First
smimeFile.Load()
Dim memoryStreamSigned As MemoryStream = New MemoryStream(smimeFile.Content)
Dim entity = MimeEntity.Load(memoryStreamSigned)
  1. 迭代所有附件的 MimeEntity 实例
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
  1. 将附件读取为字节数组。在上一步的 for 中执行此操作。
'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))

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

【讨论】:

    【解决方案2】:

    这不是错误,而是“多部分/签名”消息的预期行为。

    来自RFC5751(第26页底部):

    multipart/signed 媒体类型有两个部分。第一部分 包含已签名的 MIME 实体;第二部分包含 “分离签名”CMS SignedData 对象,其中 encapContentInfo eContent 字段不存在。

    因此,包括任何附件在内的签名内容都存储在一个 smime.p7m 附件中。由你来提取它。

    假设您使用的是 .Net,您可以使用 SignedCms 类来验证签名并使用 ContentInfo 属性检索内容。

    【讨论】:

    • application/pkcs7-mime附件中提取附件的代码是什么。 Outlook 显示 pdf 和 xml。
    猜你喜欢
    • 2021-10-18
    • 2021-03-08
    • 2012-03-13
    • 2019-03-04
    • 2017-03-02
    • 2012-05-15
    • 2014-08-30
    • 2019-09-03
    • 2010-10-30
    相关资源
    最近更新 更多