使用EWS管理的API读取自定义列

本文关键字:读取 自定义 API EWS 管理 使用 | 更新日期: 2023-09-27 17:50:34

我需要读取和写入我在Outlook中的进程邮箱(公共邮箱?)中创建的自定义列。

我想我应该以某种方式使用ExtendedPropertyDefinition,但是,我不知道如何使用。如果这有意义的话,我没有列的GUID。

我已经将自定义列命名为'Engineer',并且使用了此代码,但是我得到的ext props计数为0。

ExtendedPropertyDefinition myExtDef= 
       new ExtendedPropertyDefinition(DefaultExtendedPropertySet.PublicStrings,
                                      "Engineer",
                                      MapiPropertyType.String);

PropertySet propertySet = 
                 new PropertySet(BasePropertySet.FirstClassProperties, myExtDef);
最后

foreach (Item item in findResults)
{ 
    EmailMessage message = 
               EmailMessage.Bind(service, item.Id, new PropertySet(propertySet));
}

当我调试和检查findResults中的'item'时,我看到了subject属性和所有这些,但ExtendedProperties计数为0。似乎是我定义扩展属性的方式有问题。

谁能帮我读和写自定义列?

编辑:我现在不确定这是否可以使用托管API实现。如果有人有什么好主意,我就接受。我已经检查了以下所有内容,但都无济于事。

使用EWS管理的API访问自定义联系人http://msdn.microsoft.com/en-us/library/office/dd633697 (v = exchg.80) . aspx

和其他人…

使用EWS管理的API读取自定义列

Marton,

看起来您已经掌握了使用扩展属性的基本概念。很难说问题出在哪里,因为只有几段代码。下面是一个示例,您应该能够从中构建。它创建一个新的邮件,设置扩展属性,然后保存邮件(到草稿文件夹)。

// Create a definition for the extended property.
ExtendedPropertyDefinition extendedPropertyDefinition = new ExtendedPropertyDefinition(DefaultExtendedPropertySet.PublicStrings, "Engineer", MapiPropertyType.String);
// Create an e-mail message that you will add the extended property to.
EmailMessage message = new EmailMessage(service);
message.Subject = "Saved with custom ExtendedPropertyDefinition.";
message.Body = "The Engineer custom value is stored within the extended property.";
message.ToRecipients.Add("user@contoso.com");
// Add the extended property to an e-mail message object.
message.SetExtendedProperty(extendedPropertyDefinition, "Save some customer value");
message.Save();

现在要验证消息是用扩展属性创建的,您可以使用FindItems。下面的示例将在drafts文件夹中搜索带有"Engineer"扩展属性的消息。

ItemView view = new ItemView(10);
// Create a definition for the extended property.
ExtendedPropertyDefinition extendedPropertyDefinition = new ExtendedPropertyDefinition(DefaultExtendedPropertySet.PublicStrings, "Engineer", MapiPropertyType.String);
// Create a search filter the filters email based on the existence of the extended property.
SearchFilter.Exists customPropertyExistsFilter = new SearchFilter.Exists(extendedPropertyDefinition);
// Create a property set that includes the extended property definition.
view.PropertySet = new PropertySet(BasePropertySet.IdOnly, ItemSchema.Subject, extendedPropertyDefinition);
// Search the drafts folder with the defined view and search filter.
FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Drafts, customPropertyExistsFilter, view);
// Search the e-mail collection returned in the results for the extended property.
foreach (Item item in findResults.Items)
{
    Console.WriteLine(item.Subject);
    // Check whether the item has the custom extended property set.
    if (item.ExtendedProperties.Count > 0)
    {
        // Display the extended name and value of the extended property.
        foreach (ExtendedProperty extendedProperty in item.ExtendedProperties)
        {
            Console.WriteLine(" Extended Property Name: " + extendedProperty.PropertyDefinition.Name);
            Console.WriteLine(" Extended Property Value: " + extendedProperty.Value);
        }
    }
    else
    {
        Console.WriteLine(" This email does not have the 'Engineer' extended property set on it");
    }
}

为了在Outlook的自定义表单中查看和更新这些扩展属性,需要做一些额外的工作。Outlook表单使用附加属性将扩展属性存储为二进制字段。PidLidPropertyDefinitionStream以及扩展的属性都需要修改。不幸的是,EWS Managed API不能为您完成此操作,因此您必须自己编写一些代码来读取/更新此属性。我没有任何示例代码可以向您展示,但是这里有一些关于属性结构的链接,可以帮助您学习:

  • PidLidPropertyDefinitionStream规范属性- http://msdn.microsoft.com/en-us/library/ee415119(v=office.14).aspx
  • 属性定义流结构- http://msdn.microsoft.com/en-us/library/ee415116(v=office.14).aspx