Outlook Rest API推送通知:根据由Outlook加载项设置的特定自定义属性筛选通知
我遵循this question中提及的相同步骤,根据由Outlook加载项设置的自定义属性筛选推送通知事件。Outlook Rest API推送通知:根据由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约翰斯顿,我过验证的属性名称和它使用MFCMAPI的GUID。属性名称和它的GUID值都是正确的。
然后我从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
响应时,我让使用上述网址get调用。
正如你所看到的,响应具有空列表,即使没有与自定义属性meetingsetby
和值webex
一个日历项目。
然后,我使用outlook Rest API将SingleValueExtendedProperty
设置为日历项,如this post中所述。下面是示例请求数据,然后我从MFCMAPI收集的数据和所制备的下面的URL,以过滤具有在上述步骤singleValueExtendedProperty
组日历项目的SingleValueExtendedProperty
MFCMAPI数据。
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')
而下面是我使用上面的url进行get调用时的postman
的响应。
如您所见,我可以使用singleValueExtendedProperty
成功过滤日历项目。但我的要求是过滤器日历项目具有由我的Outlook Web插件设置特定的自定义属性。
任何建议/答案都会比欢迎。
加载项(使用CustomProperties接口)设置的自定义属性为而不是等同于正常的MAPI命名属性。基本上,插件API所做的就是将所有“自定义属性”都序列化为JSON有效内容,然后将其保存在名为cecp-{some guid}
的名为MAPI的属性中,并将属性设置为GUID PS_PUBLIC_STRINGS {00020329-0000-0000-C000-000000000046}
。该名称的{some-guid}
部分等于您加载项的Id
。这全部在MS-OXCEXT section 2.2.5中指定。
因此,最终结果是您不能在CustomProperties
接口中设置的值上使用$filter
,因为没有该名称和值的SingleValueExtendedProperty
。相反,有一个SingleValueExtendedProperty
,名称为cecp-{some guid}
,字符串值是通过CustomProperties
接口设置的所有自定义道具的JSON序列化。
那么你怎么能做到你想要的?好了,回到原来的网址,你可以通过做
$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)
的cecp-
为您加载的GUID ID后更换GUID获得具有由您的外接设置任何属性的所有消息。
但是当然你想找到那些具有特定属性(meetingsetby
)设置为特定值(webex
)的。不幸的是,我们的API在过滤SingleValueExtendedProperties
时不支持子字符串搜索。所以你需要做的是获得所有的消息与你的加载项设置的任何属性,然后做你自己的过滤逻辑来找到你想要的。所以基本上你会将它们加载到内存中,然后自己检查该属性的值以找到你想要的值。
您可以通过使用$expand
子句确保该属性的值包含在响应中。类似这样的:
?$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)
&$expand=SingleValueExtendedProperties($filter=PropertyId eq 'String
{00020329-0000-0000-C000-000000000046} Name cecp-7e248e5e-204e-4e2b-aa0f-788af20fc21c')
感谢您的回答。我试过上面的过滤器。之后,我根本没有收到推送通知。以下是新过滤器: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%20my_prop_one'%20于是%20EP%2FValue%20NE%20null)'。当我向上面的url发送请求时,即使有多个具有'my_prop_one'自定义属性的日历项目,我也会收到空数组。 – MK446
GUID可能是错误的。我本周在Ignite并且无法运行测试,但您应该能够使用MFCMapi查找属性并确定GUID。 –
我交叉验证了属性名称,它是使用MFCMapi的GUID。属性名称和它的GUID值都是正确的。 – MK446