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

Outlook 如何强制将邮箱项目持久化到EWS?,outlook,office-js,outlook-web-addins,Outlook,Office Js,Outlook Web Addins,注意:这一特定问题对我们的客户产生了重大影响,这将转化为对收入产生直接影响的高业务影响 TL;博士 当用户在撰写电子邮件草稿时与我们的外接程序交互时,我们的Office Outlook外接程序如何最大限度地减少EWS GetItem API对我们从Office.context.mailbox.item.saveAsync()收到的itemId返回OK响应所需的时间 如果我们的外接程序无法控制项目何时将持久化到EWS,那么最终用户可以做些什么来加快此速度 我们正在寻找(a)技术解决方案,或(b)信

注意:这一特定问题对我们的客户产生了重大影响,这将转化为对收入产生直接影响的高业务影响

TL;博士 当用户在撰写电子邮件草稿时与我们的外接程序交互时,我们的Office Outlook外接程序如何最大限度地减少EWS GetItem API对我们从
Office.context.mailbox.item.saveAsync()收到的
itemId
返回OK响应所需的时间

如果我们的外接程序无法控制项目何时将持久化到EWS,那么最终用户可以做些什么来加快此速度

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

最终用户影响 我们的一些客户无法使用Office Outlook外接程序发送电子邮件,或者必须等待很长时间(>2分钟)才能发送电子邮件

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

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

外接程序概述 我们的外接程序与撰写模式集成,在撰写电子邮件时提供附加功能,如模板、跟进、打开和单击跟踪以及计划

我们的外接程序与我们的SaaS产品协同工作,如下所示:

  • 我们的外接程序在电子邮件上设置EWS扩展属性,并使用元数据指示在该邮件上启用了哪些功能

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

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

    文件说明:

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

    它进一步说:

    注意:如果您的外接程序在撰写模式下对项目调用
    saveAsync
    ,以获取与EWS或REST API一起使用的
    itemId
    ,请注意,当Outlook处于缓存模式时,项目实际同步到服务器可能需要一段时间。在同步项目之前,使用
    itemId
    将返回错误

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

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

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

  • …是否知道客户端处于“缓存模式”或“联机模式”
  • …是否尝试强制客户端进入“联机模式”

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

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

    2) 能否将信息保存到自定义属性中,而不是EWS扩展属性中。(Office.context.mailbox.item.customProperties)

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

    它们以键/值对的形式存储为项目上的JSON字典。mapi属性的名称为“cecp-[manifest中的扩展id]”(在PS_PUBLIC_字符串中)

    3) 听起来解决这个问题的一个更好的方法是使用Office.js函数对其进行写访问?(尽管我们并不完全理解您的情况)。新功能的请求应通过UserVoice进行:

    4) 处于在线模式将大大缩短时间。用户可以知道自己是否处于联机模式,但外接程序不能

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


    切换到在线模式,删除了缓存模式的许多好处。缓存模式是Outlook 2016中的默认模式

    当然,听起来你最好还是和MS.Start一起打开一个支持案例。在我们回来的时候,我们已经申请了MSDN订阅下的专业服务。您可以在中找到结果。不幸的是,你的发现就是它的工作原理。@OutlookAdd insTeam MSFT的答案是完整和正确的。RE 1:幸运的是,我们只使用
    itemId
    whil