如何在C#中获取Outlook公用文件夹项目的自定义字段值
使用ExchangeService获取Outlook公用文件夹项目的自定义字段值
核心说明
ExchangeService中自定义字段分两类:UserProperty(客户端添加的自定义属性)和ExtendedProperty(扩展属性)。如果常规属性中找不到,优先通过扩展属性枚举或指定定义来获取。
代码示例
1. 先枚举所有扩展属性(用于定位目标字段)
如果不清楚自定义字段的具体属性信息,先遍历项目的所有扩展属性,拿到对应的属性集ID和标签:
using Microsoft.Exchange.WebServices.Data; using System; public void EnumerateExtendedProperties(ExchangeService service, Folder targetPublicFolder) { ItemView itemView = new ItemView(5); // 先取少量项目排查 itemView.PropertySet = new PropertySet(BasePropertySet.FirstClassProperties); itemView.PropertySet.Add(ExtendedPropertyDefinition.AllExtendedProperties); FindItemsResults<Item> items = service.FindItems(targetPublicFolder.Id, itemView); foreach (Item item in items) { Console.WriteLine($"项目主题:{item.Subject}"); Console.WriteLine("扩展属性详情:"); foreach (ExtendedProperty prop in item.ExtendedProperties) { Console.WriteLine($"属性集ID:{prop.PropertySetId} | 属性标签:{prop.Tag} | 值:{prop.Value}"); } Console.WriteLine("---"); } }
2. 直接获取指定自定义字段
拿到属性集ID和标签后,构造ExtendedPropertyDefinition精准获取值:
public void GetTargetCustomField(ExchangeService service, Folder targetPublicFolder) { // 替换为枚举得到的实际属性集ID和标签 Guid propSetId = new Guid("你的属性集ID"); int propTag = 0x1234; // 替换为实际属性标签 // 根据字段类型调整MapiPropertyType,如Integer、Boolean、DateTime等 ExtendedPropertyDefinition customFieldDef = new ExtendedPropertyDefinition(propSetId, propTag, MapiPropertyType.String); ItemView itemView = new ItemView(10); itemView.PropertySet = new PropertySet(BasePropertySet.IdOnly, ItemSchema.Subject, customFieldDef); FindItemsResults<Item> items = service.FindItems(targetPublicFolder.Id, itemView); foreach (Item item in items) { item.Load(itemView.PropertySet); if (item.TryGetProperty(customFieldDef, out object fieldValue)) { Console.WriteLine($"项目主题:{item.Subject} | 自定义字段值:{fieldValue}"); } else { Console.WriteLine($"项目主题:{item.Subject} | 未找到目标自定义字段"); } } }
3. 处理UserProperty类型的自定义字段
如果自定义字段是通过Outlook客户端直接添加的UserProperty,可通过字段名称获取:
public void GetUserPropertyField(ExchangeService service, Folder targetPublicFolder) { string customFieldName = "你的自定义字段名称"; UserPropertyDefinition userPropDef = new UserPropertyDefinition(customFieldName, MapiPropertyType.String); ItemView itemView = new ItemView(10); itemView.PropertySet = new PropertySet(BasePropertySet.IdOnly, ItemSchema.Subject, userPropDef); FindItemsResults<Item> items = service.FindItems(targetPublicFolder.Id, itemView); foreach (Item item in items) { item.Load(itemView.PropertySet); if (item.TryGetProperty(userPropDef, out object fieldValue)) { Console.WriteLine($"项目主题:{item.Subject} | 自定义字段值:{fieldValue}"); } } }
注意事项
- 确保ExchangeService已完成身份验证(根据Exchange版本选择OAuth或基本认证)。
- 匹配自定义字段的
MapiPropertyType,避免类型转换错误。 - 枚举扩展属性时,限制返回项目数量,避免性能损耗。
内容的提问来源于stack exchange,提问作者Michal
相关产品推荐
相关产品推荐

