2013-06-11 4 views
6

Ich verwende Exchang Web Services 2010, um alle ungelesenen E-Mails aus einem Postfach zu lesen und sie dann als gelesen zu markieren.Finden Sie alle ungelesenen E-Mails mit Exchange Web Service 2010 und markieren Sie sie als gelesen?

Ich bin stützen off dieses Beispiel:

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

Und haben damit kommen alle ungelesenen E-Mails zu finden, und lesen Sie den Körper Inhalt:

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

Das ist das zurückgibt Textversion aller ungelesenen E-Mail-Stellen, aber es muss eine effektivere Art geben, nein?

Weiß jemand, wie ich die E-Mail MessageType s als gelesen aktualisieren und es zurück zum Server senden lassen kann?

Antwort

4

Es gibt keine gute Möglichkeit, eine MessageType als gelesen mit EWS v1 zu markieren. Eine Problemumgehung finden Sie unter this MSDN blog post, wenn Sie mit EWS v1 festgefahren sind.

EWS v2 eingeführt die IsRead property als beschreibbar (message.IsRead = true; message.Update();), die es trivial macht. Sie können die verwaltete EWS v2-API für Exchange 2007 und höher verwenden, es handelt sich jedoch um eine separate Installation. Siehe die MSDN page on EWS Managed API 2.0 für mehr.

+0

Danke Mitch, aber bist du sicher, dass du mit dem richtigen Blogpost verlinkt bist? –

+0

@PeteyB, sieht aus als hättest du recht. Ich habe den Link aktualisiert. – Mitch

+0

Ich verwende EWS 2.0 mit einem Exchange 2013 und ich habe keine IsRead-Eigenschaft von Nachrichtenobjekt. Ich habe den folgenden Anfang mit "Is": IsAssociated, IsAttachment, IsDirty, IsDraft, IsFromMe, IsNew, IsReminderSet, IsResend, IsSubmitted und IsUnmodified. Muss ich etwas aktivieren oder eine Eigentumseigenschaft verwenden? Wenn mir jemand helfen kann, thx. – Alex

3

Ich bringe eine andere Antwort-Element, um diejenigen, die fiel in die gleiche Falle wie ich, und für diejenigen mit EWS 2.0 zu helfen:

I wurde mit einem Artikel-Typ in meiner Schleife, um die Mails zu holen in Das Postfach. Und das Item-Objekt verfügt nicht über die IsRead-Eigenschaft (ähnelt aber dem EmailMessage-Objekt). So können Sie einfach den Artikeltyp von Emailmessage-Typ in der Schleife ersetzen (weil die Besetzung von Posten zu Emailmessage Typ erlaubt ist):

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

    } 
} 

das ist, wie ich es zu arbeiten.

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 
Verwandte Themen