2013-06-11 7 views
6

私はExchang Web Services 2010を使用して、未読メールをメールボックスからすべて試して読み込み、それを読み取り済みとしてマークします。Exchange Web Service 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); 
     } 

すべての未読メール本文のテキスト版ですが、より効果的な方法が必要です。

メールアドレスMessageTypeをどのように更新してサーバーに送り返すことができますか?

答えて

4

EWS v1を使用してMessageTypeを読み取りとしてマークする良い方法はありません。 EWS v1で問題が発生した場合の回避策については、this MSDN blog postを参照してください。

EWS v2では、書き込み可能(message.IsRead = true; message.Update();)としてIsRead propertyが導入されています。 EWS v2管理対象APIは、Exchange 2007以上で使用できますが、別のインストールです。詳細については、MSDN page on EWS Managed API 2.0を参照してください。

+0

ありがとうミッチですが、正しいブログ投稿にリンクしてもよろしいですか? –

+0

@PeteyB、あなたが正しいと思われます。私はリンクを更新しました。 – Mitch

+0

Exchange 2013でEWS 2.0を使用していて、メッセージオブジェクトからIsReadプロパティがありません。 IsAssociated、IsAttachment、IsDirty、IsDraft、IsFromMe、IsNew、IsReminderSet、IsResend、IsSubmitted、およびIsUnmodifiedは、次のように「Is」で始まります。何かを活性化しなければならないのですか、または不動産のプロパティを使用する必要がありますか?誰かが私を助けてくれたら、thx。 – Alex

3

私は私のように、およびEWS 2.0を使用してそれらのために同じ罠に落ちた人たちを助けるために別の答え要素を持っている:

私はメールを取得するために私のループ内でアイテムタイプを使用していましたメールボックス。また、ItemオブジェクトにはIsReadプロパティがありません(ただし、EmailMessageオブジェクトに似ています)。 (キャストが項目からEmailMessageのタイプに許可されているため)だから、あなたは自分のループでEmailMessageのタイプによってアイテムの種類を置き換えることができます。

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

    } 
} 

私はそれが動作するようになった方法ですこと。

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 
関連する問題