通过 Microsoft 图形获取 Outlook 加载项中设置的自定义属性



假设我的Outlook加载项(使用Office.js)中有以下代码在约会的撰写形式上运行:

const item = Office.context.mailbox.item;
item.loadCustomPropertiesAsync((result) => {
const props = result.value;
const testProp = props.get("my_prop");
console.log("CUSTOM_PROP", testProp);
props.set("my_prop", "test_value");
props.saveAsync((saveResult) =>
console.log("SAVE_CUSTOM_PROP", saveResult));
});

我明白了,它实际上保存在事件中。

现在有一堆关于这些自定义属性的问题:

  1. 但是这些是否与扩展属性有某种关系?

  2. 这些属性是否可以通过Outlook REST API或Microsoft Graph以某种方式访问?

  3. 是否可以使用带有基于这些属性的筛选器的 Microsoft Graph 创建推送通知订阅?(我知道我可以基于扩展属性)

  4. 如果上述问题的答案为"否",并且只能通过创建它们的外接程序访问自定义属性,那么是否有办法从外接程序创建事件的扩展属性,即使它没有保存?

为了解释我为什么问 - 我正在创建一个加载项,它允许将约会与我们的 3rd 方系统"连接",并使该约会与我们的对象保持同步。

因此,当单击撰写表单上的按钮时,我:

  • 保存约会并获取event-id
  • 将其存储在我们的系统中,以便从我们的系统同步到约会。
  • 使用Microsoft Graph 在我们的系统中为该约会添加扩展属性

在第一次使用外接程序时,用户进行身份验证,我使用扩展属性为事件创建推送通知订阅,以执行从 Outlook 到系统的同步。

它在 OWA 上运行良好,但现在由于我们确实需要支持桌面,因此出现了两个主要问题:

  • Outlook for Mac:没有saveAsync方法,因此无法获取事件的id,我正在考虑添加一些自定义属性,然后让推送通知通知我们的系统,创建了一个需要与系统同步的事件。

  • Outlook for PC:有saveAsync方法,但回调是在约会保存在本地而不是服务器上时执行的,因此我无法确切知道事件何时创建,我可以对该事件进行一些Microsoft Graph 调用。

回答我的第一个问题,和/或关于我的用例的任何提示将非常受欢迎。

TL;博士; 是的,可以使用 REST API 读取由Office.jsapiloadCustomPropertiesAsync设置的自定义属性 您需要创建一个如下所示的 REST 调用查询

string addinManifestId = "<your manifest guid here>";//lower cases
string prop = @"String {00020329-0000-0000-C000-000000000046} Name"+ string.Format(" cecp-{0}", addinManifestId );
var url = $"<apiEndpoint>/messages/<youritemid>?$expand=SingleValueExtendedProperties($filter=PropertyId eq '{propertyname}')";

更多信息

文档可在此处获得 https://msdn.microsoft.com/en-us/library/hh968549(v=exchg.80).aspx

当我需要处理我的加载项 Keuro 的"已发送邮件"时,我遇到了类似的问题。 我在 REST API 上使用 Web 钩子实现了与您的方法非常接近的东西。据我所知,这是处理已发送物品的唯一方法。 考虑对此投赞成票 https://officespdev.uservoice.com/forums/224641-feature-requests-and-feedback/suggestions/10964871-add-itemsend-event-so-add-in-can-cancel-email

  1. 根据MS-OXCEXT,有关加载项如何在Outlook中存储内容的互操作性文档,自定义属性作为JSON字典存储在MAPI扩展属性中(该链接中的血腥详细信息)。这意味着您应该能够通过 Graph 扩展属性访问它们,您只需自己分析值即可。
  2. 应使用扩展属性和"{type} {guid} Name {name}"格式。
  3. 我不明白为什么不。
  4. 答案是否定的,但无论如何我都会回答你的后续:)。当然,如果您使用外接程序中的 REST API,则可以执行此操作。

最新更新