Outlook VSTO插件添加已确认不存在的自定义用户属性报错咨询
问题1:属性未找到仍抛出类型冲突错误的原因
- Outlook的自定义属性校验不止检查当前邮件的
UserProperties集合,还会校验邮箱层级的属性Schema定义和所属文件夹的字段定义:- 你调用
UserProperties.Find只能查到当前邮件实例上已经存在的属性,查不到邮箱底层MAPI命名空间中已注册的同名属性类型定义。如果该属性名之前被以非整数类型注册过(比如其他插件、旧版本脚本、手动创建过同名字段),即便当前邮件没有该属性,添加时也会触发类型冲突。 - 你代码中
Add方法的第三个参数AddToFolderFields设为false,仅代表不把新字段加入文件夹字段列表,但如果所属文件夹已经存在同名不同类型的字段定义,依然会触发冲突。 - 少部分情况是Outlook客户端的属性Schema缓存损坏,导致误判存在冲突属性。
- 你调用
问题2:仅单用户多设备报错的原因
该问题和用户的邮箱配置直接相关:
- 若用户使用Exchange/Office 365邮箱,属性Schema定义是存储在服务器端的邮箱配置中,会同步到所有登录该邮箱的设备,因此会出现多台设备均报错的情况。
- 其余用户的邮箱中没有
Custom.Secured同名的非整数类型属性残留定义,因此不会触发冲突。
可行解决方案
- 最简便的方案是直接更换自定义属性的名称,避开残留的冲突定义。
- 可使用MFCMAPI工具查看该用户邮箱
PS_PUBLIC_STRINGS命名空间下的属性定义,删除Custom.Secured对应的错误类型残留。 - 改用
PropertyAccessor接口直接操作MAPI属性,跳过UserProperties的Schema校验,示例代码如下:
// 0x00000003对应PT_LONG也就是olInteger类型,直接指定属性类型不会触发冲突 const string PropTag = "http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/Custom.Secured/0x00000003"; mailItem.PropertyAccessor.SetProperty(PropTag, 1);
内容的提问来源于stack exchange,提问作者bulunga
相关产品推荐
相关产品推荐

