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

Dev*_*rry 5 outlook office-js outlook-web-addins

注意:这个特殊问题对我们的客户有重大影响,这会转化为对收入产生直接影响的高业务影响。

TL;博士。

当用户在撰写电子邮件草稿时与我们的加载项交互时,我们的 Outlook 的 Office 加载项如何最大限度地减少EWS GetItem APIitemId我们收到的返回 OK 响应之前所需的时间Office.context.mailbox.item.saveAsync()

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

我们正在寻找 (a) 技术解决方案或 (b) 消息来指导我们的客户如何缓解/修复/解决此问题。

最终用户影响

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

我们的目标

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

附加上下文

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

我们的插件概述

我们的加载项与撰写模式集成,以在撰写电子邮件时提供其他功能,例如模板、跟进、打开和点击跟踪以及计划。

我们的插件与我们的 SaaS 产品协同工作,如下所示:

  1. 我们的加载项使用元数据设置电子邮件消息的 EWS 扩展属性,指示该消息启用了哪些功能。

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

根本原因分析

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

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

在 Outlook Web App 或 Outlook 联机模式中,项目将保存到服务器。在缓存模式下的 Outlook 中,项目将保存到本地缓存。

它继续说:

注意:如果您的加载saveAsync项在撰写模式下调用某个项目以便itemId与 EWS 或 REST API 一起使用,请注意,当 Outlook 处于缓存模式时,该项目可能需要一些时间才能真正同步到服务器。在项目同步之前,使用itemId将返回错误。

因此,我们得出的结论是Office.context.mailbox.item.saveAsync(),虽然它确实返回了一个最终有效的 itemId,但并不能保证任何后续的 EWS 交互都会成功。到目前为止,我们还没有发现任何方法可以加速 Outlook 客户端实际让 EWS 了解邮箱项目的过程。

减轻

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

理解“在线模式”与“缓存模式”

如果 Outlook 2016 for Windows 桌面客户端处于“缓存模式”,用户是否可以执行以下操作:

  1. ...知道客户端是处于“缓存模式”还是“在线模式”?
  2. ...试图强制客户端进入“在线模式”?

小智 1

在缓存模式下无法加快速度。不幸的是,这是撰写模式下 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

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

它们以键/值对的形式存储在项目上的 JSON 字典中。mapi 属性的名称是“cecp-[清单中的扩展 ID]”(在 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

此外,状态栏在缓存模式下会显示“已连接到 Microsoft Exchange”,在在线模式下会显示“与 Microsoft Exchange 联机”。

切换到在线模式会消除缓存模式所具有的许多优势。Outlook 2016 中默认使用缓存模式。