首页 > 解决方案 > Microsoft Graph API 为同一邮件返回了不同的 threadID

问题描述

在我们的应用程序中,我们调用 Microsoft Graph API 来获取电子邮件标头数据。在对 api 的初始调用期间,我们收到了以下电子邮件的 conversationId 详细信息

{"conversationId":"AAQkADVhMzU1YWY5LWVkNGQtNGZjOC1hMjJmLTk0MzIxMGQzMzRhMQAQAA8kZ_w6rdxIsHkFk+h7byQ="}

几秒钟后,当我们对同一封电子邮件发出类似请求时,我们收到了不同的会话 ID

{"conversationId":"AAQkADVhMzU1YWY5LWVkNGQtNGZjOC1hMjJmLTk0MzIxMGQzMzRhMQAQAA8kZ_w6rdxIsHkFk_h7byQ="}

现在这里的期望是 conversationId 的值应该始终保持不变。在上述情况下,返回的 2 个 conversationId 的唯一区别是 '+' 被替换为 '_'

详细步骤:-

问题:-

+和_是否有可能互换

标签: microsoft-graph-api

解决方案


您不应该假设 Exchange 标识符可以跨平台互换。多年来,Exchange 使用了大量不同的标识符格式。这可能是这里问题的症结所在。

有一些机制可以在它们之间进行转换,但我通常建议不要这样做,除非你别无选择。

我不确定您为什么/如何解析 OWS DOM,但坦率地说,我更惊讶的是标识符比我更接近,因为它没有按预期工作。如果您想从 OWA 中的 Graph 中提取消息,我会为此使用Outlook Web 加载项。加载项框架包括一个convertToRestId方法,该方法返回一个可用于 Microsoft Graph 的标识符:

function getItemRestId() {
  if (Office.context.mailbox.diagnostics.hostName === 'OutlookIOS') {
    // itemId is already REST-formatted
    return Office.context.mailbox.item.itemId;
  } else {
    // Convert to an item ID for API v2.0
    return Office.context.mailbox.convertToRestId(
      Office.context.mailbox.item.itemId,
      Office.MailboxEnums.RestVersion.v2_0
    );
  }
}

至于+vs _,这归结为编码格式。Base64 有多种风格。标准 在标准 Base64 中,第 62 个字符是+,第 63 个字符是/. 当您想在 URL 中使用 Base64 作为保留字符时,这会出现+问题/。为了解决这个问题,您需要一个 Base64 的 URL 安全变体。有几种这样的变体。最常见的是base64url(在RFC 4648-中定义),它将第 62 个和_第 63个交换出来。


推荐阅读