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

2024-04-06

Note:这一特殊问题对我们的客户产生重大影响,这会转化为巨大的业务影响,对收入产生直接影响。

TL;DR.

当用户在撰写电子邮件草稿时与我们的加载项交互时,我们的 Outlook Office 加载项如何最大限度地缩短电子邮件草稿发送之前所需的时间?EWS 获取项目 API将返回 OK 响应itemId我们收到来自Office.context.mailbox.item.saveAsync()?

If事实证明,我们的加载项无法控制该项目何时被持久化到 EWS,那么最终用户可以采取什么措施来加快速度?

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

最终用户影响

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

Our Goal

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

附加背景

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

我们的插件概述

我们的插件集成了Compose模式在创作时提供附加功能电子邮件消息,例如模板、后续、打开和点击跟踪以及日程安排。

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

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

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

根本原因分析

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

的文档Office.context.mailbox.item.saveAsync() https://dev.office.com/reference/add-ins/outlook/1.5/Office.context.mailbox.item?product=outlook#saveasyncoptions-callback says:

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

它进一步说:

Note:如果您的加载项调用saveAsync在撰写模式下的项目上以获得itemId要与 EWS 或 REST API 一起使用,请注意,当 Outlook 处于缓存模式时,可能需要一些时间才能将项目实际同步到服务器。直到项目同步为止,使用itemId将返回一个错误。

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

减轻

我们试图通过以下方式缓解这个问题polling EWS 获取项目 https://msdn.microsoft.com/en-us/library/office/aa565934(v=exchg.150).aspx试图获得ChangeKey对于带有itemId我们收到来自Office.context.mailbox.item.saveAsync()。虽然我们已经看到这最终会成功,但可能需要一分钟或更长时间才能发生。对于我们的客户来说,等待的时间实在是太长了。

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

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

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

在缓存模式下无法加快速度。不幸的是,这是撰写模式下 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 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 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 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 https://support.office.com/en-us/article/Turn-on-Cached-Exchange-Mode-7885af08-9a60-4ec3-850a-e221c1ed0c1c

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我们如何强制将邮箱项目持久保存到 EWS? 的相关文章

随机推荐

  • 检查视频是否正在流式传输

    我有这个流来自http www tpai tv live http www tpai tv live但正如您现在所看到的 它已关闭 我需要检查流是否正在播放 如果不播放其他内容 这是流式传输代码
  • MimeMessage.saveChanges 真的很慢

    由于包含以下内容 以下测试的执行时间约为 5 秒m saveChanges import org junit Before import org junit Test import javax mail MessagingException
  • 哪些 C99 功能被认为是有害的或不受支持的 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我通常在 C89 中编写 C 代码 现在使用 C99 的一些功能 例如intxx t or VA ARGS or snprintf 非常有用 甚
  • PHP 的 require 和 include 有什么区别?

    我知道PHP require require一次 include和includeonce的基本用法 但我对何时应该使用它们感到困惑 示例 我有 3 个文件 例如 settings php database php 和 index php 在
  • Cocoapods 不工作 Xcode 9.2

    Cocoapods 已安装但无法工作 Xcode 9 2 我尝试了这些解决方案https github com CocoaPods CocoaPods issues 3777 https github com CocoaPods Cocoa
  • 在调试中禁用应用程序洞察

    如何在使用调试配置时自动禁用应用程序洞察并仅在发布时启用它 是否可以在不创建另一个仅用于调试的仪器密钥的情况下执行此操作 I have trackevent语句分散在代码中 将它们包含在调试预处理器检查中并不是理想的解决方案 我当前的解决方
  • 如何告诉 find 命令转义文件名中的空格字符?

    我有一个单行 find 命令 它递归地检查并打印出在特定时间范围内创建的特定文件类型的大小 所有者和名称 但在结果中 给出文件名列 直到目录或文件名中的第一个空格字符为止 有没有办法在这个单一命令中解决这个问题 而无需在 bash 中编写任
  • 在android中使用OpenGL在按钮上单击绘制形状

    作为 android OpenGL 部分的新手 我已经下载了现场给出的示例使用 OpenGL ES 显示图形 http developer android com training graphics opengl index html so
  • Chrome 中的 Javascript 执行跟踪 - 如何进行?

    我在网站上加载了约 100 200 个 JavaScript 函数 我想确定当我单击 Google Chrome 中的一项或多项时执行什么 JavaScript 函数 我如何使用 Chrome Web 开发人员工具来做到这一点 谢谢 一种简
  • 基于流的应用程序中的受控/手动错误/恢复处理

    我正在开发一个基于的应用程序Apache Flink 它利用Apache Kafka用于输入和输出 该应用程序可能会被移植到Apache Spark 所以我也将其添加为标签 问题仍然相同 我要求通过 kafka 接收的所有传入消息必须按顺序
  • Cloud Firestore 中 get() 和 onSnapshot() 之间的区别

    我正在从 Firebase 的 Cloud Firestore 读取一些数据 但我已经看到了几种方法来做到这一点 我看到的示例使用了 get 和 onSnapshot 函数 如下所示 db collection cities doc SF
  • 测试:单元、集成、其他,分离的必要性是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 对于问题我是单元测试还是集成测试 https stackoverflow com questions 516572我已经回答了 有点挑衅 进行测
  • 如何检查$compile是否已经完成?

    我正在编写一个函数 可以根据 HTML 模板和给出的一些信息创建电子邮件模板 为此 我正在使用 compile角的函数 只有一个问题我似乎无法解决 该模板由一个基本模板和无限数量的ng include的 当我使用 最佳实践 时 timeou
  • AngularJS:带去抖功能的 $watch

    我有以下代表搜索字段的 html
  • 错误:CFBundleVersion 必须高于之前上传的版本

    我想上传我的应用程序的新版本 我在 iTunes 中的应用程序的旧版本是 2 1 我正在上传新版本 2 2 但是当我尝试验证我的应用程序时 它会给出错误 CFBundleVerion must be higher than the prev
  • 如何在 R 中的稀疏矩阵中查找并命名连续的非零条目?

    我的问题在概念上很简单 我正在寻找一种计算有效的解决方案 我自己的解决方案附在最后 假设我们有一个可能非常大的稀疏矩阵 如下左图所示 并且想要用单独的代码 命名 连续非零元素的每个区域 请参见右侧的矩阵 1 1 1 1 1 1 1 1 1
  • Jquery:检查第一个实例

    在获取奇怪的输出并将其转换为可读的剧本格式时遇到一些麻烦 这是 HTML div p class actor John p p class line I want to buy milk p p class actor John p p c
  • MySQL - 如何将“使用连接缓冲区(块嵌套循环)”添加到查询中?

    当我在笔记本电脑上运行查询时 执行时间大约需要一秒钟 但在生产环境中 查询会持续 57 秒 并且它会导致应用程序崩溃 这是用 Ruby On Rails 编写的 我运行这个查询EXPLAIN并发现在我的笔记本电脑上是在执行的查询中的一张表上
  • 面试期间用于编码测试的 OOP 问题 [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 作为第二次采访 我让人们坐下来编写代码 我尝试使问题真正独立于技术 我遇到的编程问题并没有真正锻炼人们的面向对象能力 我倾向于尝试在
  • 我们如何强制将邮箱项目持久保存到 EWS?

    Note 这一特殊问题对我们的客户产生重大影响 这会转化为巨大的业务影响 对收入产生直接影响 TL DR 当用户在撰写电子邮件草稿时与我们的加载项交互时 我们的 Outlook Office 加载项如何最大限度地缩短电子邮件草稿发送之前所需