同一封邮件具有多个不可变ID?

时间:2019-10-07 03:20:44

标签: microsoft-graph outlook-addin office-js office-addins outlook-web-addins

我正在编写一个具有React前端和dotnet核心后端的Office Outlook加载项。我已使用Graph API设置了订阅,以便在SentItems文件夹中出现新电子邮件时接收通知。我想将通知中的电子邮件与我存储在数据库中的信息相关联。

不幸的是,邮件ID在发送电子邮件时发生了更改,并从“草稿”文件夹移至SentItems,因此对匹配没有用。

有一个新的ImmutableId,它在文件夹之间移动电子邮件时不会更改。我一直无法获得Office.js库来生成ImmutableId,但是有一个translateExchangeIds方法,当给定电子邮件项ID时,它将返回一个不可变的ID。

// convert to immutable
var translateRequest = new {
    inputIds = new string [] { mailMessage.ItemId },
    targetIdType = "restImmutableEntryId",
    sourceIdType = "restId"
};
var immutableResponse = await graphClient.PostAsJsonAsync("me/translateExchangeIds", translateRequest);
var immutableId = await immutableResponse.Content.ReadAsStringAsync();

我可以使用该不可变ID通过Graph请求检索电子邮件:

await graphClient.GetAsync($"Users/cccccccc-dddd-eeee-ffff-ba0c52e56d99/Messages/AAkALgAAAAAAHYQDEapmEc2byACqAC-EWg0AQ-irLc2NFESKcGAhz1k_GBBDB5JMOwAA/

但是,与订阅通知一起返回的不可变ID是同一封邮件的另一个不可变ID。因此,无法将通知邮件与存储在我的数据库中的邮件信息进行匹配。因此,我仍然必须将自定义属性附加到消息上,其唯一目的是使数据库条目与SentItems通知相匹配。

是否有更好的方法来解决此问题?

更新:我的理论是,发生差异是因为当项目位于不同的文件夹中时,会生成不可变的id吗?将项目ID转换为不可变ID时,该项目仍位于“草稿”文件夹中。发生订阅通知时,该项目位于“已发送项目”文件夹中。以下响应来自使用不同的不可变ID的查询,但标识相同的消息-myId GUID是附加到消息的自定义属性,用于将通知与存储在本地数据库中的消息信息相关联。

\"id\":\"AAkALgAAAAAAHYQDEapmEc2byACqAC-EWg0AQ-irLc2NFESKcGAhz1k_GAADB4INPAAA\",...,\"myId\":\"8baa904f-cf64-437c-878c-be4f71714aee\"

\"id\":\"AAkALgAAAAAAHYQDEapmEc2byACqAC-EWg0AQ-irLc2NFESKcGAhz1k_GAADB4INLwAA\",...,\"myId\":\"8baa904f-cf64-437c-878c-be4f71714aee\"

1 个答案:

答案 0 :(得分:0)

在Exchange Online中,草稿邮件与发送的邮件不同。发送后的草稿邮件不会保留回邮箱。分发邮件后,Exchange将创建已传递邮件的副本,并将其复制回已发送邮件中。

由于不是同一条消息,因此ImmutableId会更改,这是预期的行为。

对于您的情况,使用custom属性是可行的方法。