获取 S/MIME 签名邮件的附件

2024-05-06

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

I use a GET请求在这个网址上:

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

这应该返回指定邮件的对象列表。每个对象都包含元数据,例如“name" and "内容类型一个附件的“以及属性”内容字节“其中包含附件的内容作为base64-string.

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

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

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

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

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


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

  1. Install Mimekit Nuget 包 https://www.nuget.org/packages/MimeKit/
  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 并从中创建新的内存流。然后创建该流的 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))

现在您的附件文件已解码为字节数组,您可以保存它或执行任何您想要的操作:)希望这有帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取 S/MIME 签名邮件的附件 的相关文章

随机推荐

  • 如何删除html中单击的元素周围的虚线

    我发现如果有一个a页面中的链接不链接到新页面 那么当用户单击它时 该元素周围会有一条虚线 只有当用户单击页面中的其他任何内容时它才会消失 如何删除它 Example 注意元素周围的虚线Section 2 Use outline none锚定
  • 如何在 IDE 中输入提示上下文?

    我在用Closure call http php net manual en closure call php http php net manual en closure call php 在类上下文中调用外部闭包 这是一个简单的重现 c
  • 索引多列并匹配不同的值,返回跨列的唯一值列表

    我已经在漫长的几周内广泛寻找解决我的问题的方法了 我提出了一个部分有效的解决方案 我将其包含在底部 供那些可能知道如何修改 扩展它们以解决问题的人使用 这就是我想要完成的任务 以下描述参考此屏幕截图https i stack imgur c
  • 从两个不同的表中减去值

    考虑表X A 1 2 3 3 6 考虑表 Y A 0 4 2 1 9 如何编写一个查询来获取这两个表之间的差异 以计算下表 例如表 Z A 1 2 1 2 3 目前尚不清楚你想要什么 会是这个吗 SELECT SELECT SUM A FR
  • PHP 会话锁定并使用 Memcache 存储会话

    我有一个标准的 html 页面 其中有一些 img 标签 每个标签都指向我们服务器上的一个 php 文件 加载 php 文件时 它会在生成图像之前将一些数据保存到会话中 来自每个脚本的会话中的数据随后将在我们的应用程序中的其他脚本中使用 生
  • 如何向表示多对多关系的 MySQL 闭包表添加排序顺序?

    这是我的问题的后续 如何在MySQL中实现多对多的层次结构 https stackoverflow com questions 9691366 how to implement a many to many hierarchical str
  • 浮点等于的意外结果

    问题不在于为什么0 1 0 9不等于1 0 这是关于平等者的不同行为 有人可以解释为什么下面的示例的工作方式不同 float q 0 1f float w 0 9f float summ q w q w 1 0f False summ 1
  • Django检查用户组权限

    我有一个名称 的自定义权限可以显示分发页面 代号 can show distribute page 内容类型 User 我添加两个组 名为 manager and normal 一个拥有所引用的许可 一个没有 如何判断用户是否有该权限 我尝
  • 为什么json序列化器不符合多态性?

    我在 NET 4 5 Windows 应用商店应用程序中使用库存 JSON 序列化器 System Runtime Serialization Json DataContractJsonSerializer 我有一个由 API 提供商提供的
  • 使用math.random在java中进行猜谜游戏

    您好 我正在尝试使用 Math random 生成 0 到 100 之间的随机数 然后要求用户输入 0 到 100 之间的数字 或 1 退出 如果数字超出范围 且不是 1 请要求用户输入新数字 如果用户没有正确猜出数字 则告诉用户随机数是否
  • 如何防止Excel单元格中前导零自动截断

    如果我粘贴04562 它会自动截断前导零并将其存储为4562 我希望将其存储为04562 如果您使用 MS Excel 编辑需要存储带前导零的数字的单元格 只需将单元格内容格式化并定义为文本即可 如果您以编程方式存储它 则可以将该值放在引号
  • Ruby 安装由于缺少扩展而中止:openssl、readline、zlib 编译错误

    我正在使用 macOS Catalina 我正在尝试通过 rbenv 安装旧版本的 Ruby 1 9 3 2 1 2 但是 在尝试安装旧版本时 我不断收到以下错误 安装 2 4 或更新版本时没问题 我已经尝试过 brew install o
  • Python 2to3 Windows CMD

    我已经安装了 python 32 包到 C python32 我还设置了路径 Python 路径 C Python32 Lib C Python32 DLLs C Python32 Lib lib tk 路径 C Python32 我想使用
  • 存储DotNetOpenAuth信息和用户信息检索

    这个问题有点结构 设计问题 因为我无法找出执行任务的最佳方法 在我的 MVC 应用程序中 我使用 DotNetOpenAuth 3 4 作为我的登录信息提供程序 并且仅使用标准FormsAuthentication用于饼干等 DB中当前用户
  • 如何像mysql一样对数组进行排序

    如何对与数据库数据相同的数组进行排序 我请求谷歌分析数据 数据是一个大数组 我想将数组与本地数据库中的一些其他字段连接起来 然后我再次扩展大数组 现在我想对大数组进行排序 这与使用我的 sql 相同 如下所示 select from ga
  • 无法加载(查找)j2v8_android_x86 库

    我有一个使用的 gradle 项目j2v8 android 2 2 1 http mvnrepository com artifact com eclipsesource j2v8 j2v8 android 2 2 1库 为 V8 JS 引
  • 不带()的sizeof有什么作用? [复制]

    这个问题在这里已经有答案了 作者是这个问题 https stackoverflow com questions 18898410 2 dimensional array simple understanding当我问他什么时 他只是取笑我s
  • 如何在 Option::and_then 或 Option::map 闭包中使用 async/await 而不使用 OptionFuture?

    我想运行类似以下代码的代码 async fn get user s str gt Option
  • 我如何访问警报内容提供商

    我正在尝试访问警报提供商以获取所有启用的警报信息 所以我写了这个 public static final Uri CONTENT URI Uri parse content com android deskclock alarm Conte
  • 获取 S/MIME 签名邮件的附件

    我正在尝试通过 microsoft graph api 获取签名邮件的附件 I use a GET请求在这个网址上 https graph microsoft com v1 0 me messages AAMkAG attachments