Outlook Rest API推送通知:根据outlook加载项

时间:2017-09-21 08:38:32

标签: microsoft-graph outlook-restapi

我按照this question中提到的相同步骤,根据outlook加载项设置的自定义属性过滤推送通知事件。

以下是订阅推送通知时使用的资源链接。

https://outlook.office.com/api/v2.0/me/events/?$filter=SingleValueExtendedProperties%2FAny(ep%3A%20ep%2FPropertyId%20eq%20'String%20{00020329-0000-0000-C000-000000000046}%20Name%20cecp-7e248e5e-204e-4e2b-aa0f-788af20fc21c'%20and%20ep%2FValue%20ne%20null)

它正在过滤具有由加载项设置的自定义属性的日历项,而不管它是什么自定义属性。 通过查看此资源链接,我们可以说我们没有提到自定义属性名称。但是我的加载项为日历项设置了多个自定义属性。我想过滤所有具有特定自定义属性的日历项。例如,我的加载项根据业务登录将以下任何一个自定义属性设置为日历。

自定义属性1:

var item = Office.context.mailbox.item;
item.loadCustomPropertiesAsync((result) => {
     const props = result.value;
     props.set("my_prop_one", "test_value_one");
     props.saveAsync((saveResult) => console.log("Successfull"));
 });

自定义属性2:

var item = Office.context.mailbox.item;
 item.loadCustomPropertiesAsync((result) => {
      const props = result.value;
      props.set("my_prop_two", "test_value_tw");
      props.saveAsync((saveResult) => console.log("Successful"));
 });

现在,我想过滤所有具有自定义属性my_prop_one的日历项目。

编辑1:

正如@Jason Johnston在其中一条评论中所建议的那样,我使用MFCMapi交叉验证了属性名称及其GUID。属性名称和它的GUID值都是正确的。

自定义属性meetingsetby的MFCMapi数据。

然后我从MFCMapi收集数据并准备下面的网址来过滤具有自定义属性meetingsetby且值为webex的日历项目。

https://outlook.office.com/api/v2.0/Me/Events?$filter=SingleValueExtendedProperties%2FAny(ep%3A%20ep%2FPropertyId%20eq%20'String%20{00020329-0000-0000-C000-000000000046}%20Name%20meetingsetby'%20and%20ep%2FValue%20eq%20'webex')

以下是我使用上面的网址拨打电话时来自postman的回复。

如您所见,即使有一个包含自定义属性meetingsetby和值webex的日历项,响应也会显示空列表。

然后我使用outlook Rest API将SingleValueExtendedProperty设置为日历项,如this post中所述。以下是样本请求数据, Outlook Rest API request to set Single Value Extended Property

SingleValueExtendedProperty的MFCMapi数据 MFCMapi data of SingleValueExtendedProperty

然后我从MFCMapi收集数据并准备下面的网址来过滤在上一步中设置singleValueExtendedProperty的日历项目。

https://outlook.office.com/api/v2.0/Me/Events?$filter=SingleValueExtendedProperties%2FAny(ep%3A%20ep%2FPropertyId%20eq%20'String%20{6666AA44-4659-4830-9070-00047EC6AC6E}%20Name%20RestApiSingleValueExtendedProperty'%20and%20ep%2FValue%20eq%20'Set this property using REST API')

以下是我使用上面的网址拨打电话时来自postman的回复。 Filter response based on singleValueExtendedProperty

如您所见,我可以使用singleValueExtendedProperty成功过滤日历项目。但我的要求是过滤器日历项目具有由我的Outlook Web加载项设置的特定自定义属性。

任何建议/答案都非常受欢迎。

1 个答案:

答案 0 :(得分:1)

加载项设置的自定义属性(使用CustomProperties接口)等同于普通的MAPI命名属性。基本上,附加API所做的是将所有"自定义属性",将它们序列化为JSON有效负载,然后将其保存在单个MAPI命名属性中,其名称为cecp-{some guid} ,以及属性设置GUID PS_PUBLIC_STRINGS {00020329-0000-0000-C000-000000000046}。名称的{some-guid}部分等于加载项的Id。这都在MS-OXCEXT section 2.2.5中指定。

因此,最终结果是您不能对$filter接口中设置的值使用CustomProperties,因为没有SingleValueExtendedProperty具有该名称和值。相反,有一个名为SingleValueExtendedProperty的{​​{1}},其字符串值是您通过cecp-{some guid}界面设置的所有自定义道具的JSON序列化。

那你怎么能做你想要的呢?好吧,回到原始网址,您可以通过

获取加载项设置了任何属性的所有邮件
CustomProperties

使用您的加载项的GUID ID替换$filter=SingleValueExtendedProperties/Any (ep: ep/PropertyId eq 'String {00020329-0000-0000-C000-000000000046} Name cecp-7e248e5e-204e-4e2b-aa0f-788af20fc21c' and ep/Value ne null) 后的GUID。

但是您当然希望找到具有特定属性(cecp-)设置为特定值(meetingsetby)的属性。不幸的是,我们的API在过滤webex时不支持子字符串搜索。因此,您需要做的是获取具有由加载项设置的任何属性的所有消息,然后执行您自己的过滤逻辑以找到您想要的那些。所以基本上你会把它们加载到内存中,然后自己检查一下这个属性的值,找到你想要的那个。

您可以使用SingleValueExtendedProperties子句确保属性的值包含在响应中。像这样:

$expand