You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于MAPI命名属性GetIDsFromNames的两个技术疑问

Outlook VSTO中MAPI命名属性的常见疑问解答

疑问1:在新建邮件上调用带MAPI_CREATE的GetIDsFromNames时,是否会生成和之前邮件相同的Tag编号?

  • 分两种情况:
    • 如果是同一个命名空间下的同一个属性名称,在同一邮箱存储内,两次调用会返回相同的Tag编号。这是正常行为——MAPI会确保同一命名属性在同一存储中对应唯一的Tag,这样不同邮件的同一名属性能保持一致性,不会冲突。
    • 如果是全新的属性(不同名称或不同命名空间),MAPI会生成唯一的新Tag,不会与已有属性的Tag重复,完全不用担心冲突问题。

疑问2:GetNamesFromIDs接收、GetIDsFromNames返回的是否仅为高2字节的属性ID?使用返回值时需要重新添加类型信息吗?

  • 是的,这两个方法仅处理高2字节的属性ID,不包含低2字节的类型信息:
    • 调用GetNamesFromIDs时,你传入的是完整的4字节Tag(包含类型),但方法内部会忽略低2字节的类型部分,只使用高2字节的属性ID来匹配对应的名称和命名空间。
    • GetIDsFromNames返回的是纯16位属性ID(高2字节),因此当你要给属性赋值时,必须手动将这个属性ID与对应的属性类型(比如PT_STRING8、PT_LONG等)组合成完整的4字节Tag,格式为:(属性类型 << 16) | 属性ID。如果不添加类型信息,MAPI无法识别属性的类型,会导致赋值失败。

代码示例

// 从原邮件获取的属性名称和命名空间
string propName = "MyCustomProperty";
string propNamespace = "http://mycompany.com/outlook/properties";

// 在新邮件上获取属性ID(带MAPI_CREATE标志)
int propId = newMail.PropertyAccessor.GetIDsFromNames(
    new object[] { propNamespace, propName },
    new int[] { 0x00000001 /* MAPI_CREATE */ })[0];

// 组合完整Tag,这里使用PT_STRING8类型(0x001E)
int fullTag = (0x001E << 16) | propId;

// 给新邮件的自定义属性赋值
newMail.PropertyAccessor.SetProperty(fullTag, "自定义属性值");

内容的提问来源于stack exchange,提问作者darbid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 19:31:13