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

时间:2017-10-10 16:27:42

标签: outlook office-js outlook-web-addins

  

注意:此特定问题会对我们的客户产生重大影响,从而导致高业务影响,并对收入产生直接影响。

TL; DR

当用户在编写电子邮件草稿时与我们的加载项交互时,如何为Outlook添加Outlook,最大限度地减少 EWS GetItem API 返回之前所花费的时间我们从itemId收到的Office.context.mailbox.item.saveAsync()确认回复了吗?

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

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

最终用户影响

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

我们的目标

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

附加上下文

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

加载项概述

我们的插件与撰写模式集成,可在撰写电子邮件时提供其他功能,例如模板,后续操作,打开和点击跟踪以及日程安排。

我们的插件与我们的SaaS产品协同工作:

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

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

  3. 根本原因分析

    我们问题的根本原因是我们在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()来自{{1} }}。虽然我们已经看到这最终会成功,但在此之前可能需要一分钟或更长时间。对于我们的客户来说,这是太多的时间了。

    了解"在线模式" vs"缓存模式"

    如果Outlook 2016 for Windows桌面客户端处于"缓存模式",那么用户可以做些什么:

    1. ...知道客户端是否处于"缓存模式"或"在线模式"?
    2. ...试图强迫客户进入"在线模式"?

1 个答案:

答案 0 :(得分:1)

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

1)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中是默认模式。