如何识别并过滤自有应用通过Microsoft Graph API操作的Outlook事件通知
解决方案
以下几种方法可帮你识别并过滤自身API操作产生的Outlook事件变更通知,减少不必要的处理:
1. 添加自定义扩展属性标记
通过Graph API创建/更新事件时,给事件加一个专属的自定义扩展属性(比如CreatedByMyApp),收到通知后检查该属性即可判断是否为自身应用操作的事件。
具体操作:
创建事件的请求体中加入扩展属性:
{ "subject": "测试事件", "start": { "dateTime": "2025-09-07T10:00:00", "timeZone": "UTC" }, "end": { "dateTime": "2025-09-07T11:00:00", "timeZone": "UTC" }, "categories": ["Test-Category"], "singleValueExtendedProperties": [ { "id": "String {00020329-0000-0000-C000-000000000046} Name CreatedByMyApp", "value": "true" } ] }
收到通知后,调用GET /users/{id}/events/{eventId}?$expand=singleValueExtendedProperties拉取事件详情,若CreatedByMyApp属性存在且值为true,直接跳过处理。
2. 本地维护操作日志
在应用内记录所有通过Graph API创建/更新的事件ID、操作时间,可选记录事件关键字段的哈希值。收到通知后:
- 先核对事件ID是否在日志中
- 再判断操作时间(比如忽略1分钟内的通知,规避网络延迟导致的重复触发)
- 可选:对比事件哈希值,确认是否为自身操作的版本
这种方法无需修改事件本身,但要注意定期清理过期日志,避免冗余存储。
3. 利用lastModifiedBy属性(仅适用于应用权限场景)
如果你的应用使用应用权限而非委派权限操作事件,lastModifiedBy字段中的application会显示你的应用ID。收到通知后拉取事件详情,检查该字段是否匹配你的应用信息:
{ "lastModifiedBy": { "application": { "id": "你的应用ID", "displayName": "你的应用名称" } } }
注意:若使用委派权限(代表用户操作),lastModifiedBy会显示用户信息,和手动操作无法区分,这种场景下该方法不适用。
补充说明
目前Microsoft Graph的订阅$filter不支持直接过滤自定义扩展属性,无法在订阅层面直接排除自身应用的事件,只能在收到通知后做二次校验。
内容的提问来源于stack exchange,提问作者Lnacer
相关产品推荐
相关产品推荐

