使用EWS托管API读取自定义列

时间:2014-03-15 11:33:35

标签: c# .net exchangewebservices ews-managed-api extended-properties

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

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

我已将自定义列命名为“Engineer”,使用此代码,但我获得了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实现这一点。如果有任何人有一些想法,我会接受它。我已经检查了以下所有内容,但无济于事。

Accessing custom contacts using EWS managed API http://msdn.microsoft.com/en-us/library/office/dd633697(v=exchg.80).aspx

还有其他人......

1 个答案:

答案 0 :(得分:1)

马顿,

看起来你有使用扩展属性的基本概念是正确的。很难说问题出在哪里,因为您的代码只有几个片段。这是一个你应该能够构建的例子。它会创建一个新邮件,设置扩展属性,然后保存邮件(到草稿文件夹)。

// 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。以下示例将使用" 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不会为您执行此操作,因此您必须自己编写一些代码来读取/更新此属性。我没有任何示例代码可以向您展示,但这里有一些关于属性结构的链接,可以帮助您: