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

Posted

技术标签:

【中文标题】使用 EWS 托管 API 读取自定义列【英文标题】:Read custom column with EWS managed API 【发布时间】:2014-03-15 11:33:34 【问题描述】:

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

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

我已将自定义列命名为“工程师”,并使用了此代码,但我的 ext 道具计数为 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 中调试和检查“项目”时,我看到了主题属性和所有内容,但 ExtendedProperties 计数为 0。看起来我定义扩展属性的方式有问题。

谁能帮助我如何读写自定义列?

编辑: 我现在不太确定是否可以使用托管 API 来实现这一点。如果有人有一些想法,我会接受。我检查了以下所有内容,但无济于事。

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

还有其他...

【问题讨论】:

【参考方案1】:

马顿,

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

// 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。以下示例将在草稿文件夹中搜索具有“工程师”扩展属性的消息。

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 托管 API 不会为您执行此操作,因此您必须自己编写一些代码来读取/更新此属性。我没有任何示例代码可以向您展示,但这里有一些有关属性结构的链接,它们将在此过程中为您提供帮助:

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

【讨论】:

您好 Bob,感谢您的回复,您是希望的灯塔 :) 我可以使用上面的代码,但是,它不能满足我的需要。我在 Outlook 中添加了一个额外的列。存储在该列中的数据...... ExtendedProperties 甚至可以访问吗? (如果我用上面的方法新建邮件,“工程师”一栏还是空白的,多出来的一栏是根据link Marton,我用草稿文件夹中的一条消息做了一些额外的测试,如我的示例所示。我为名为“TestColumn”的消息创建了一个自定义列,并且通过更改 ExtendedPropertyDefinition 以查找新列名,我能够使用上面的代码查看列的内容。底线是这些值存储在 PublicStrings 扩展属性集中。 Outlook 中的某些内容无法显示 Engineer 的原始值,但如果我使用 Outlook 表单更新它,我的代码会显示新值。如果我找到更多信息,我会通知您。 非常感谢。我期待着您的建议。与此同时,我看到了类似的行为:我通过 Outlook 在其中一封邮件中的 Engineer 列中输入了一个值,而您的代码确实发现它具有超过 0 个 ExtendedProperty,列出了名称(“Engineer”),但对于 value它显示为空白。 (应该是“测试”——我知道有多原创 :)) 有趣的是,下面的结果是“它的 null”,所以显然在 Outlook 中写入值之后,它被存储在其他地方。 ` if (extendedProperty.Value == null) Console.WriteLine("它的 null"); ` Marton,我找到了有关这些扩展属性的更多信息。 Outlook 还将它们保存在名为 PidLidPropertyDefinitionStream 的二进制属性中。我在上面的答案中添加了一些链接,可能会对您有所帮助。

以上是关于使用 EWS 托管 API 读取自定义列的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试通过 EWS 托管 API 读取/更新任务的 .Body 时出错 - “您必须先加载或分配此属性,然后才能读取其值。”

[Exchange]使用EWS托管API2.0同步邮箱

使用 EWS(不是托管 API)进行模拟

EWS 托管 API 双跳

使用 EWS 托管 API 创建共享邮箱

如何使用 EWS 托管 API 从 Microsoft Exchange 检索所有联系人?