无法获取电子邮件的内置属性以及扩展属性

时间:2014-03-06 12:23:06

标签: c# email exchange-server exchangewebservices

我正在使用Exchange Web服务托管API。我正在为收件箱中的邮件添加一个扩展属性,因为它们会根据某些条件进行处理。因此,并非所有邮件都会附加这些扩展属性。

接下来我正在重新收集收件箱中的所有邮件,如果他们附加了这个属性,我会再次处理它们。

下面是一个简单的方法getAllMailsInInbox(),我写的是为了重新收集收件箱中的邮件:

class MyClass
{
    private static Guid isProcessedPropertySetId;
    private static ExtendedPropertyDefinition isProcessedPropertyDefinition = null;

    static MyClass()
    {
        isProcessedPropertySetId = new Guid("{20F3C09F-7CAD-44c6-BDBF-8FCB324244}");
        isProcessedPropertyDefinition = new  ExtendedPropertyDefinition(isProcessedPropertySetId, "IsItemProcessed", MapiPropertyType.String);
    }

    public List<EmailMessage> getAllMailsInInbox()
    {
        List<EmailMessage> emails = new List<EmailMessage>();
        ItemView itemView = new ItemView(100, 0);
        FindItemsResults<Item> itemResults = null;

        PropertySet psPropSet = new PropertySet(BasePropertySet.IdOnly);
        itemView.PropertySet = psPropSet;

        PropertySet itItemPropSet = new PropertySet(BasePropertySet.IdOnly,                                             
                                          ItemSchema.Attachments,
                                          ItemSchema.Subject,                                               
                                          ItemSchema.Importance,
                                          ItemSchema.DateTimeReceived,
                                          ItemSchema.DateTimeSent,
                                          ItemSchema.ItemClass,
                                          ItemSchema.Size,
                                          ItemSchema.Sensitivity,
                                          EmailMessageSchema.From,
                                          EmailMessageSchema.CcRecipients,
                                          EmailMessageSchema.ToRecipients,       
                                          EmailMessageSchema.InternetMessageId,                                                              
                                          ItemSchema.MimeContent,
                                          isProcessedPropertyDefinition);   //***

         itemResults = service.FindItems(WellKnownFolderName.Inbox, itemView); 
         service.LoadPropertiesForItems(itemResults.Items, itItemPropSet);

         String subject = itItem.Subject; //Exception: "You must load or assign this property before you can read its value."
         //....
    }
}

如您所见,在调用service.LoadPropertiesForItems()时,它不会加载任何属性,因此在访问任何这些属性时会导致You must load or assign this property before you can read its value.异常。

如果我从isProcessedPropertyDefinition属性集中删除itItemPropSet,则会正确获取所有属性。

我还能知道如何获取所有内置的EmailMessage属性以及扩展属性?

2 个答案:

答案 0 :(得分:3)

您的GUID在最后一个破折号后太短了两位数。奇怪的是你没有看到FormatException。您仍应更新代码以检查每个项目的GetItemResponse。这样,如果在一个项目上发生某些错误,您的代码就可以意识到它。这意味着您需要再次制作另一个集合。

使用以下代码更新您的代码:

ServiceResponseCollection<ServiceResponse> responses = service.LoadPropertiesForItems(itemResults.Items, itItemPropSet);

foreach (ServiceResponse response in responses)
{
       if (response.Result == ServiceResult.Error)
       {
           // Handle the error associated
       }

       else
       {
           String subject = (response as GetItemResponse).Item.Subject;
       }
}

答案 1 :(得分:0)

而不是做  service.LoadPropertiesForItems(itemResults.Items,itItemPropSet);

尝试

itemResult.LoadPropertiesForItems(itItemPropSet);

获得项目后,您可以通过加载特定项目来加载项目的扩展属性。