如何修改代码在Outlook 365中读取PidNameContentType属性值?
解决Redemption读取Outlook 365中PidNameContentType属性为空的问题
你硬编码的属性标签0x8063001F是PidNameContentType在特定环境下的动态分配值,这个实例ID(即0x8063中的63部分)并非固定不变——不同Outlook版本、配置或邮箱环境中,命名属性的实例ID可能会变化,这就是代码在Outlook 2016正常但365中读取为空的核心原因。
正确的做法是通过命名属性的官方定义动态获取对应属性标签,而非依赖硬编码的动态值。PidNameContentType属于PS_PUBLIC_STRINGS命名空间,对应的属性名称为Content-Type。
修改后的代码如下:
Redemption.MAPIUtils MAPIUtils_l = new Redemption.MAPIUtils(); // PS_PUBLIC_STRINGS命名空间的固定GUID Guid psPublicStrings = new Guid("00020329-0000-0000-C000-000000000046"); // 根据命名空间和属性名称动态获取属性标签 int contentTypeTag = MAPIUtils_l.GetIDsFromNames(NewMail_l.MAPIOBJECT, ref psPublicStrings, "Content-Type", 0); // 读取属性值 string Content_l = MAPIUtils_l.HrGetOneProp(NewMail_l.MAPIOBJECT, contentTypeTag);
说明
PS_PUBLIC_STRINGS的GUID是固定的,对应MAPI公共命名属性空间;GetIDsFromNames方法会根据当前环境动态解析出正确的属性标签,彻底避免硬编码实例ID带来的兼容性问题;- 此修改后,代码可在Outlook 2016和365环境中一致读取到PidNameContentType的正确值。
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

