Найти все непрочитанные электронные письма с помощью веб-службы Exchange 2010, а затем пометить как прочитанные?

Я использую Exchang Web Services 2010, чтобы попытаться прочитать все непрочитанные электронные письма из почтового ящика, а затем пометить их как прочитанные.

Я основываюсь на этом примере:

http://msdn.microsoft.com/en-us/library/exchange/aa563373(v=exchg.140).aspx

И придумали это, чтобы найти все непрочитанные электронные письма и прочитать содержимое тела:

        //Set up the connection to exchange service
        ExchangeServiceBinding exchangeService = new ExchangeServiceBinding();
        exchangeService.Credentials = new NetworkCredential("userid", "password", "domain");
        exchangeService.Url = "https://exchangeserver/ews/exchange.asmx";

        //REturn all properties
        FindItemType findType = new FindItemType();
        findType.Traversal = ItemQueryTraversalType.Shallow;
        findType.ItemShape = new ItemResponseShapeType();
        findType.ItemShape.BaseShape = DefaultShapeNamesType.AllProperties;

        //Only search the inbox
        DistinguishedFolderIdType[] foldersToSearch = new DistinguishedFolderIdType[1];
        foldersToSearch[0] = new DistinguishedFolderIdType();
        foldersToSearch[0].Id = DistinguishedFolderIdNameType.inbox;
        findType.ParentFolderIds = foldersToSearch;

        //Only unread emails
        RestrictionType restriction = new RestrictionType();
        IsEqualToType isEqualTo = new IsEqualToType();
        PathToUnindexedFieldType pathToFieldType = new PathToUnindexedFieldType();
        pathToFieldType.FieldURI = UnindexedFieldURIType.messageIsRead;

        //Not IsRead
        FieldURIOrConstantType constantType = new FieldURIOrConstantType();
        ConstantValueType constantValueType = new ConstantValueType();
        constantValueType.Value = "0";
        constantType.Item = constantValueType;
        isEqualTo.Item = pathToFieldType;
        isEqualTo.FieldURIOrConstant = constantType;
        restriction.Item = isEqualTo;

        //set the not IsRead restriction
        findType.Restriction = restriction;

        try
        {
            FindItemResponseType findResponse = exchangeService.FindItem(findType);
            ResponseMessageType[] responseMessType = findResponse.ResponseMessages.Items;

            List<ItemIdType> unreadItemIds = new List<ItemIdType>();

            //get all unread item IDs
            foreach (ResponseMessageType respMessage in responseMessType)
            {
                if(respMessage is FindItemResponseMessageType)
                {
                    FindItemResponseMessageType itemResponse = (FindItemResponseMessageType)respMessage;

                    if (itemResponse.ResponseClass == ResponseClassType.Success)
                    {
                        if (itemResponse.RootFolder.Item != null)
                        {

                            if (itemResponse.RootFolder.Item is ArrayOfRealItemsType)
                            {
                                ArrayOfRealItemsType items = (ArrayOfRealItemsType)itemResponse.RootFolder.Item;

                                if (items.Items != null)
                                {
                                    ItemType[] itemTypes = items.Items;

                                    foreach (ItemType item in itemTypes)
                                    {
                                        if (item is MessageType)
                                        {
                                            unreadItemIds.Add(item.ItemId);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            if (unreadItemIds.Count == 0)
                MessageBox.Show("No unread emails found");
            else
            {
                //Get all unread mail messages, display body
                GetItemType getItemType = new GetItemType();
                getItemType.ItemShape = new ItemResponseShapeType();
                getItemType.ItemShape.BaseShape = DefaultShapeNamesType.AllProperties;
                getItemType.ItemShape.BodyType = BodyTypeResponseType.Text;
                getItemType.ItemShape.BodyTypeSpecified = true;
                getItemType.ItemIds = unreadItemIds.ToArray();

                GetItemResponseType getItemResponse = exchangeService.GetItem(getItemType);

                if(getItemResponse.ResponseMessages != null)
                {
                    ArrayOfResponseMessagesType responseMessages = getItemResponse.ResponseMessages;
                    foreach(ResponseMessageType responseMessage in responseMessages.Items)
                    {
                        if (responseMessage is ItemInfoResponseMessageType)
                        {
                            ItemInfoResponseMessageType responseItemInfo = (ItemInfoResponseMessageType)responseMessage;
                            if (responseItemInfo.Items != null)
                            {
                                ArrayOfRealItemsType responseRealItems = (ArrayOfRealItemsType)responseItemInfo.Items;

                                if (responseRealItems.Items != null)
                                {
                                    foreach (ItemType responseItemType in responseRealItems.Items)
                                    {
                                        if (responseItemType is MessageType)
                                        {
                                            MessageType fullMessage = (MessageType)responseItemType;

                                            BodyType body = fullMessage.Body;

                                            if (body != null)
                                            {
                                                MessageBox.Show(body.Value);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        catch(Exception ee)
        {
            MessageBox.Show(ee.Message +" " + (ee.InnerException ?? new Exception("")).Message);
        }

Это возвращает текстовую версию всех непрочитанных сообщений электронной почты, однако должен быть более эффективный способ, не так ли?

Кто-нибудь знает, как я могу обновить электронную почту MessageTypes как прочитанную и отправить ее обратно на сервер?


person Petey B    schedule 11.06.2013    source источник


Ответы (2)


Нет хорошего способа пометить MessageType как прочитанное с помощью EWS v1. См. эту запись в блоге MSDN для временного решения, если вы застряли с EWS v1.

EWS v2 представил IsRead свойство доступно для записи (message.IsRead = true; message.Update();), что делает его тривиальным. Вы можете использовать управляемый API EWS v2 для Exchange 2007 и более поздних версий, но это отдельная установка. См. страницу MSDN на управляемом API EWS 2.0. для получения дополнительной информации.

person Mitch    schedule 12.06.2013
comment
Спасибо, Митч, но вы уверены, что ссылаетесь на правильный пост в блоге? - person Petey B; 12.06.2013
comment
Я использую EWS 2.0 с Exchange 2013, и у меня нет свойства IsRead из объекта сообщения. У меня есть следующее начало: IsAssociated, IsAttachment, IsDirty, IsDraft, IsFromMe, IsNew, IsReminderSet, IsResend, IsSubmitted и IsUnmodified. Должен ли я что-то активировать или использовать свойство свойства? Если кто-то может помочь мне, спасибо. - person Alex; 19.03.2014
comment
Похоже, вы имеете дело с типом Item (msdn.microsoft.com/en-us/library/). IsRead существует в EmailMessage (msdn.microsoft.com/en-us/library/). Убедитесь, что вы попали в правильный класс. - person Mitch; 19.03.2014

Я привожу еще один элемент ответа, чтобы помочь тем, кто попал в ту же ловушку, что и я, и тем, кто использует EWS 2.0:

Я использовал тип элемента в своем цикле для получения почты в почтовом ящике. И объект Item не имеет свойства IsRead (но похож на объект EmailMessage). Таким образом, вы можете просто заменить тип Item на тип EmailMessage в своем цикле (поскольку разрешено приведение типа Item к типу EmailMessage):

foreach (EmailMessage message in findResults.Items)
{
   if(message.IsRead==false) //if the current message is unread
   {
      //treatment
   } 
   else
   {

   }
}

Вот как я заставил его работать.

person Alex    schedule 19.03.2014