microsoft-graph-api - 获取 S/MIME 签名邮件的附件

标签 microsoft-graph-api

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

我用的是 GET请求在这个网址上:

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

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

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

到目前为止,对于未通过 S/MIME 签名的每封邮件,这都可以正常工作。 .
但是,如果邮件是用 S/MIME 签名的,我在响应列表中得到奇怪的结果。

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

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

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

最佳答案

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

  • 安装 Mimekit Nuget Package
  • 通过查看其内容类型和附件名称来正确识别 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
    
  • 将 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)
    
  • 遍历所有附件的 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
    
  • 将您的附件读取为字节数组。在上一步的 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))
    

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

    关于microsoft-graph-api - 获取 S/MIME 签名邮件的附件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51961935/

    相关文章:

    azure-active-directory - 验证用户在德国国家云中使用图形 API

    azure - (PHS) Azure AD 中的密码哈希同步

    ios - 在 iOS 中更改用户密码时,MSGraphSDK 用户详细信息 API 回调未响应

    php - 通知端点验证不适用于 Laravel 端点

    javascript - 获取 Microsoft 365 订阅价格时使用什么 api(即 Office 365 Business Essentials - $6/每位用户每月)

    javascript - Microsoft Online Auth 没有 'Access-Control-Allow-Origin' header

    office365 - Microsoft Graph API : Get all rules for mail account

    spring-security - Spring Security oauth2 客户端 - 如何获取 JWT token

    node.js - 尝试刷新 token 时出现 invalid_grant 错误

    microsoft-graph-api - 使用 Office 365 REST API 从共享日历中获取事件