使用 EWS 列出所有可用的扩展属性

Posted

技术标签:

【中文标题】使用 EWS 列出所有可用的扩展属性【英文标题】:List all available extended properties using EWS 【发布时间】:2015-04-10 10:15:15 【问题描述】:

我正在尝试找到一种方法来使用 EWS 列出一组日历项目的所有扩展属性。

问题是我设法在网上找到的所有示例都要求我提前知道这些扩展属性是什么。这是official MSDN example。

如果我不知道扩展属性的 ID 或名称,我该怎么办?或者我什至不知道是否存在任何扩展属性?

我尝试了以下代码,但它返回异常...

            var calendarItems = service.FindAppointments(WellKnownFolderName.Calendar, view);
            var propertySet = new PropertySet(AppointmentSchema.ExtendedProperties);
            service.LoadPropertiesForItems(calendarItems, propertySet);

这是一个例外:

Microsoft.Exchange.WebServices.Data.ServiceResponseException: The request failed schema validation: The required attribute 'FieldURI' is missing.

【问题讨论】:

它有完整的文档,请参阅这个答案:***.com/a/1937842/350188 【参考方案1】:

EWS 中没有调用来获取所有扩展属性。扩展属性背后的想法是应用程序使用它们来存储特定于应用程序的数据,因此只有该应用程序需要知道其属性的详细信息。

扩展 MAPI 可以发现此信息。 https://github.com/stephenegriffin/mfcmapi 有大量用于不同任务的示例代码,包括迭代命名属性。

【讨论】:

我第二个@Jason。扩展属性背后的基本思想是让移动/网络应用程序能够存储与每个 Outlook 项目相关联的自定义数据,以便每次访问该特定 Outlook 项目时,都可以相应地对其进行处理。【参考方案2】:

我看起来也很相似,我只是做了一种逆向工程。由于扩展属性是 ID(整数)和我们无法知道的数据类型的组合,因为它们没有记录在任何 MSDN 上。因此,对于字符串类型属性,将 1 迭代到 15000 之类的巨大数字并找到可以成功加载的那些 - 这是我们可以通过使用 try-catch 绑定该扩展属性来完成的主要技巧部分。然后你可以得到所需的。 希望对您有所帮助。

  List<int> allStringIds = new List<int>();
for (int i = 0; i <= 15000; i++)

    allStringIds.Add(i);


ParallelOptions options = new ParallelOptions

    MaxDegreeOfParallelism = 200,
    CancellationToken = CancellationToken.None,
;

Parallel.For(0, allStringIds.Count, options, index =>

    try
    
     ExtendedPropertyDefinition extendedPropertyDefinition = new ExtendedPropertyDefinition(index,
                   MapiPropertyType.String);
     latestMessage = EmailMessage.Bind(service, item.Id.UniqueId,
     new PropertySet(BasePropertySet.FirstClassProperties, extendedPropertyDefinition));
     _logger.Write("Supported string property id=" + index);
     supportedListId.TryAdd(index, index);
 
 catch(Exception ex)
 

 
);

 foreach (var a in supportedListId)
 
  ExtendedPropertyDefinition extendedPropertyDefinition = new ExtendedPropertyDefinition(a.Key,
  MapiPropertyType.String);
  allExtendedPropertyDefinitions.Add(extendedPropertyDefinition);
 
 latestMessage = EmailMessage.Bind(service, item.Id.UniqueId,
 new PropertySet(BasePropertySet.FirstClassProperties, allExtendedPropertyDefinitions));
 
 foreach (var extendedProperty in latestMessage.ExtendedProperties)
 
 if (extendedProperty.PropertyDefinition != null && extendedProperty.PropertyDefinition.Tag != null)
 
  if (extendedProperty.Value != null)
  
     _logger.Write($"OMG... extendedProperty id=extendedProperty.PropertyDefinition.Id," +
         $" name= extendedProperty.PropertyDefinition.Name, value=extendedProperty.Value");
    
   
   

【讨论】:

以上是关于使用 EWS 列出所有可用的扩展属性的主要内容,如果未能解决你的问题,请参考以下文章

使用扩展属性字段 (EWS) 在 EmailMessage 中创建投票

EWS 中的复制操作和扩展属性的问题

列出表和表扩展属性

Angular 控制台扩展

预警系统 | Powershell:加载日历项扩展属性

使用 EWS 读取 Exchange Server 上的所有自定义属性