2013-06-11 8 views
6

Utilizzo Exchang Web Services 2010 per provare a leggere tutte le e-mail non lette da una casella di posta, quindi contrassegnarle come già letti.Trova tutte le e-mail non lette utilizzando Exchange Web Service 2010 quindi contrassegna come letto?

sto basando fuori questo esempio:

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

e sono venuto su con questo per trovare tutte le email non lette, e leggere il contenuto del corpo:

 //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); 
     } 

che fa tornare la versione testuale di tutti i corpi di posta elettronica non letti, tuttavia deve esserci un modo più efficace, no?

Qualcuno sa come posso aggiornare l'e-mail MessageType come letto e inviarlo di nuovo al server?

risposta

4

Non c'è un buon modo per contrassegnare un MessageType come letto utilizzando EWS v1. Vedi this MSDN blog post per una soluzione alternativa se sei bloccato con EWS v1.

EWS v2 illustra la IsRead property come scrivibile (message.IsRead = true; message.Update();), che lo rende banale. È possibile utilizzare l'API gestita da EWS v2 per Exchange 2007 e versioni successive, ma si tratta di un'installazione separata. Vedere lo MSDN page on EWS Managed API 2.0 per ulteriori informazioni.

+0

Grazie Mitch, ma sei sicuro si è collegato al il post sul blog giusto? –

+0

@PeteyB, sembra che tu avessi ragione. Ho aggiornato il link. – Mitch

+0

Utilizzo EWS 2.0 con Exchange 2013 e non ho alcuna proprietà IsRead dell'oggetto messaggio. Ho il seguente inizio da "Is": IsAssociated, IsAttachment, IsDirty, IsDraft, IsFromMe, IsNew, IsReminderSet, IsResend, IsSmodified e IsUmodified. Devo attivare qualcosa o usare una proprietà di proprietà? Se qualcuno può aiutarmi, grazie. – Alex

3

che sto portando un altro elemento risposta al fine di aiutare coloro che sono caduti nella stessa trappola come me, e per coloro che utilizzano EWS 2.0:

stavo usando un tipo di articolo nel mio ciclo per andare a prendere la posta in la casella di posta. E l'oggetto Item non ha la proprietà IsRead (ma è simile all'oggetto EmailMessage). Quindi, si può semplicemente sostituire il tipo di voce per tipo EmailMessage nel loop (perché il cast è consentito dalla voce di tipo EmailMessage):

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

    } 
} 

È così che ho preso a lavorare.

1
 For Each appointment As EmailMessage In service.FindItems(WellKnownFolderName.Inbox, New SearchFilter.SearchFilterCollection(LogicalOperator.And, New SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, False)), New ItemView(999)) 
      ' set as read 
      appointment.IsRead = True 
      appointment.Update(ConflictResolutionMode.AlwaysOverwrite) 
     Next