2013-08-08 62 views
9

Exchange Webサービスを使用してメールボックスに接続し、FindItemsSearchFilterを使用して特定の条件に一致するメッセージを検索しています。Exchange Webサービス:受信者に送信された電子メールを検索する

私はこのようなメールアドレス「から」上のフィルタリングメールボックス内のメールを取得することができます:

var service = new ExchangeService(ExchangeVersion.Exchange2010_SP1) 
      { 
       TraceEnabled = true, 
       Credentials = new WebCredentials(username, password) 
      }; 

var filter = new SearchFilter.ContainsSubstring(EmailMessageSchema.From, "[email protected]"); 

service.FindItems(WellKnownFolderName.Inbox, filter, new ItemView(50)) 

そして、私はこのような DisplayToプロパティに基づいてフィルタリングすることができます

var filter = new SearchFilter.ContainsSubstring(EmailMessageSchema.DisplayTo, "display name"); 

しかし、これまでのようにし受信者の表示名のみを検索するとわかります。私は電子メールアドレスまたはドメイン名で検索したい。私はそれを期待するとき

これは結果を返しません:

var filter = new SearchFilter.ContainsSubstring(EmailMessageSchema.ToRecipients, "[email protected]"); 

それが受信者リストには、指定された電子メールアドレスが含まれているすべての電子メールを見つけることは可能ですか?

+0

は、この問題のように見える、まだEWSのAPI 2.2に存在します。回避策を見つけましたか? – 02Anant

+0

@ 02Anant私の解決策は、質問の文字列でFindItemsを使用することでした。私の答えに示され、ここで説明しました。https://msdn.microsoft.com/en-us/library/ee693615.aspx – mattk

答えて

4

を使用して複雑な検索を作成する方法について説明します。

クエリ文字列を取るExchangeService.FindItemsの異なるオーバーロードを使用することは可能です。私が思うのアドレスがToまたはCcの分野でのアドレスから、ToまたはCcの分野で

var contactEmailAddress = "[email protected]"; 

var querystring = string.Format("(From:={0} OR Participants:={0})", contactEmailAddress); 

service.FindItems(WellKnownFolderName.Inbox, queryString, view); 

である電子メールを検索

var contactEmailAddress = "[email protected]"; 

var querystring = string.Format("Participants:={0}", contactEmailAddress); 

service.FindItems(WellKnownFolderName.Inbox, queryString, view); 

である電子メールを検索

この機能にはExchange 2010が必要です。

クエリ構文上のいくつかの追加のリソース:

5

正しいフォルダ、つまり送信アイテムにアクセスしていない可能性があります。

service.FindItems(WellKnownFolderName.SentItems, filter, new ItemView(50)) 

を編集することで

service.FindItems(WellKnownFolderName.Inbox, filter, new ItemView(50)) 

を置き換えます。私は最初の質問を誤解。 はたぶん、あなたは、次のMSDNのブログを見ている必要があります:http://blogs.msdn.com/b/akashb/archive/2010/03/05/how-to-build-a-complex-search-using-searchfilter-and-searchfiltercollection-in-ews-managed-api-1-0.aspx それは私が受信者の電子メールアドレスに基づいて電子メールを検索しSearchFilterを使用する方法を見つけることができませんでしたEWS

+1

これは問題ではありません。受信トレイフォルダには、EWSを使用して取得する必要のあるメールが含まれています。 Inboxで電子メールを検索することはできますが、SearchFilter APIを使用する場合は受信者アドレスで電子メールをフィルタリングすることはできません。 – mattk

+0

私の回答 – Fabien

+0

ありがとう@ファビアン、はい私はそれからINBOX => SENTITEMSの問題を理解しましたが、SentItemsフォルダから特定の受信者に送信されたメールをフィルタリングできません。あなたのリンクをチェックしました。==、!=、<, >などで検索する機能を提供しますが、in_arrayのようにはありません。 RecipientsArrayに電子メールアドレスが存在するかどうかを確認するようなものが必要です。あなたは私を導くことができますか? –

1

あなたは追加のプロパティと要素を取得するためにFindItems方法やFindItem関数操作を拡張することはできません注意ToRecipients,CcRecipientsおよびBccRecipients。これらの値を取得する必要がある場合は、FindItemsメソッドまたはFindItem操作を使用して電子メールのアイテムIDを取得し、BindメソッドまたはGetItem操作を使用して必要なプロパティを取得します。 参考:ここでMSDN Email properties

は、私はそれをやった方法です:

ItemView view = new ItemView(200); 
    view.PropertySet = new PropertySet(BasePropertySet.IdOnly, EmailMessageSchema.DateTimeSent); 

    List<SearchFilter> searchFilterCollection = new List<SearchFilter>(); 
    searchFilterCollection.Add(new SearchFilter.IsGreaterThanOrEqualTo(EmailMessageSchema.DateTimeSent, LastServiceRun)); //Fetching recently sent emails 
    //In case you want to have more than one filter  
    SearchFilter searchFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.And, searchFilterCollection); 

    FindItemsResults<Item> results = service.FindItems(WellKnownFolderName.SentItems, searchFilter, view); 

    foreach (Microsoft.Exchange.WebServices.Data.EmailMessage item in results) 
    { 
     PropertySet propSet = new PropertySet(BasePropertySet.IdOnly, EmailMessageSchema.ToRecipients); 

     EmailMessage sentEmail = (EmailMessage)Item.Bind(service, item.Id, propSet); 

     if (sentEmail.ToRecipients.Any(sEmail => sEmail.Address == mySearchEmailAddress)) 
     { 
      //An email found where an address is in the To field - Your logic comes here 
     } 

    }` 
関連する問題