我们如何强制将邮箱项目持久保存到 EWS?

How can we force a mailbox item to be persisted to EWS?

Note: This particular issue has significant impact on our customers, which translates to high business impact with direct consequences on revenue.

TL;DR.

当用户在撰写电子邮件草稿时与我们的加载项交互时,我们的 Outlook Office 加载项如何最大限度地减少 EWS GetItem API 会 return 对我们从 Office.context.mailbox.item.saveAsync() 收到的 itemId 的 OK 响应吗?

如果事实证明我们的加载项无法控制项目何时持久保存到 EWS,那么 最终用户可以做什么加快速度?

我们正在寻找 (a) 技术解决方案,或 (b) 消息以指导我们的客户如何 mitigate/fix/work 解决此问题。

最终用户影响

我们的一些客户无法使用我们的 Outlook Office 加载项发送电子邮件,或者必须等待很长时间(> 2 分钟)才能发送电子邮件。

我们的目标

我们希望所有客户都能够使用我们的加载项发送电子邮件,而不必等待不合理的时间。

其他上下文

根据我们的日志和客户报告,此问题仅存在于 Outlook 2016 for Windows 桌面应用程序中。我们没有证据表明该问题存在于任何其他版本的 Outlook 中,包括 Outlook 2013 或 Mac 的 Outlook,但这些客户端也可能存在该问题。

我们的加载项概述

我们的加载项与 Compose 模式集成,可在撰写 电子邮件 时提供附加功能,例如模板、跟进、打开并点击跟踪和调度。

我们的加载项与我们的 SaaS 产品协同工作,如下所示:

  1. 我们的加载项在电子邮件上设置 EWS 扩展属性,其中包含指示该邮件启用了哪些功能的元数据。

  2. 我们的带外 SaaS 产品配置为通过 EWS API 从客户的邮箱中读取。当它遇到我们的 Office 加载项编写的 EWS 扩展属性时,它会触发代码路径以满足所需的行为。

根本原因分析

我们问题的根本原因是我们在 Windows 的 Outlook 2016 中与 EWS 的交互。 为了与 EWS 成功交互以 read/write 邮箱项目,它必须知道该项目。

Office.context.mailbox.item.saveAsync() 的文档说:

In Outlook Web App or Outlook in online mode, the item is saved to the server. In Outlook in cached mode, the item is saved to the local cache.

进一步说:

Note: If your add-in calls saveAsync on an item in compose mode in order to get an itemId to use with EWS or the REST API, be aware that when Outlook is in cached mode, it may take some time before the item is actually synced to the server. Until the item is synced, using the itemId will return an error.

因此,我们得出结论 Office.context.mailbox.item.saveAsync(),尽管它确实 return 并且 最终有效 itemId,但不能保证任何后续 EWS 交互将成功。到目前为止,我们没有找到任何方法来加速 Outlook 客户端实际让 EWS 知道邮箱项目的过程。

缓解

我们已尝试通过 轮询 EWS GetItem 尝试为具有 itemId 的项目获取 ChangeKey 来缓解此问题从 Office.context.mailbox.item.saveAsync() 收到。虽然我们已经看到这最终会成功,但可能需要一分钟或更长时间才能发生。对于我们的客户来说,等待的时间实在是太长了。

了解 "online mode" 与 "cached mode"

如果 Windows 桌面客户端的 Outlook 2016 在 "cached mode" 中,用户可以做些什么来:

  1. …知道客户端是在"cached mode"还是"online mode"?
  2. …试图强制客户端进入"online mode"?

无法在缓存模式下加快速度。不幸的是,这是组合模式下 saveAsync 的限制。一些注意事项:

1) EWSId 仅在项目为草稿时有效。发送后,当该项目在已发送项目中时,它将有一个新的 EWSId,该 EWSId 无法从 Office.js

中获取

2) 能否将您的信息保存到自定义属性中,而不是 EWS 扩展属性中。 (Office.context.mailbox.item.customProperties) https://dev.office.com/reference/add-ins/outlook/1.5/CustomProperties?product=outlook

这些属性将保存到已发送邮件中的邮件中,但不会被传输。那你能找到那些属性吗

这些以 Key/Value 对的形式存储为项目的 JSON 字典。 mapi 属性 的名称是 "cecp-[extension id from manifest]"(在 PS_PUBLIC_STRINGS 中)

https://msdn.microsoft.com/en-us/library/office/cc842512.aspx

3) 解决这个问题的更好方法是 Office.js 函数,它提供对此的写入权限? (尽管我们不完全了解您的情况)。新功能请求应通过 UserVoice:

https://officespdev.uservoice.com/forums/224641-general/category/131778-outlook-add-ins

4) 在线模式会大大减少时间。用户可以知道他或她是否处于在线模式,但插件不能。

https://support.office.com/en-us/article/Turn-on-Cached-Exchange-Mode-7885af08-9a60-4ec3-850a-e221c1ed0c1c

此外,状态栏在缓存模式下会显示"Connected to Microsoft Exchange",在在线模式下会显示"Online with Microsoft Exchange"。

切换到联机模式,消除了缓存模式的许多好处。缓存模式是 Outlook 2016 中的默认模式。