如何通过Outlook生日约会关联属性获取联系人名称或EntryID?
识别Outlook中与已删除联系人关联的孤立生日/纪念日约会项
当为Outlook联系人(ContactItem)设置生日或纪念日时,系统会自动生成对应的约会项(AppointmentItem);但删除联系人后,这些关联的约会项并不会被自动移除。此前已有方案可移除与现有联系人关联的这类约会,但现在需要识别出那些和已删除联系人绑定的“孤立”约会项。
查看生日/纪念日约会项的属性后,发现有四个用于存储联系人关联信息的属性:
- PidLidContactLinkEntry
- PidLidContactLinkName
- PidLidContactLinkSearchKey
- PidLidContacts
通过appointment.PropertyAccessor,可以获取到以下两个PT_BINARY类型的属性值:
- PidLidContactLinkEntry
- PidLidContactLinkSearchKey
另外两个属性并未被Outlook暴露出来。
核心问题
如何通过上述两个可获取的属性值,得到对应联系人的名称或EntryID?
解决方案
1. 解析PidLidContactLinkEntry获取联系人EntryID
PidLidContactLinkEntry存储的是联系人EntryID的二进制形式,可通过以下步骤转换并验证:
- 调用
appointment.PropertyAccessor.BinaryToString()方法,将该属性的PT_BINARY值转换为Base64编码的字符串,这就是对应的联系人EntryID。 - 用Outlook的
Namespace.GetItemFromID()方法尝试根据该EntryID获取联系人对象:如果返回null或抛出异常,说明该联系人已被删除,此约会项即为孤立项;若成功获取联系人,则可直接读取其FullName属性得到名称。
2. 通过PidLidContactLinkSearchKey匹配联系人
PidLidContactLinkSearchKey存储的是联系人的唯一标识SearchKey,可通过二进制对比判断:
- 遍历联系人文件夹中的所有联系人,通过
ContactItem.PropertyAccessor.GetProperty()获取每个联系人的PidTagSearchKey属性值(PT_BINARY类型)。 - 将约会项的PidLidContactLinkSearchKey值与联系人的SearchKey值进行二进制字节对比:若找不到匹配项,说明约会项对应的联系人已被删除;若找到匹配,可直接读取联系人名称。
3. 辅助验证:结合约会标题判断
约会项的Subject属性通常默认格式为“[联系人姓名]的生日/纪念日”,可作为辅助判断手段:
- 从Subject中提取疑似联系人姓名的部分,在联系人文件夹中进行搜索;若无匹配结果,结合上述属性验证结果,可确认该约会项为孤立项。
内容的提问来源于stack exchange,提问作者RudiBoy
相关产品推荐
相关产品推荐

