2013-08-08 14 views
9

Uso i servizi Web di Exchange per connettermi a una cassetta postale e cercare messaggi che soddisfano determinati criteri, utilizzando FindItems con un SearchFilter.Servizi Web di Exchange: ricerca di e-mail inviate a un destinatario

posso ottenere messaggi di posta elettronica in una cassetta postale di filtraggio sulla 'dal' indirizzo e-mail come questa:

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)) 

E posso filtrare sulla proprietà DisplayTo in questo modo:

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

Ma per quanto riguarda Posso dire che cerca solo il nome visualizzato del destinatario. Voglio cercare su un indirizzo email o nome di dominio.

Questo non restituisce risultati quando mi aspetterei a:

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

E 'possibile trovare tutte le email in cui l'elenco dei destinatari contiene un indirizzo di posta elettronica specificato?

+0

Sembra che questo problema esiste ancora in EWS API 2.2. Hai trovato qualche soluzione? – 02Anant

+0

@ 02Anant La mia soluzione era di usare FindItems con una stringa di query, mostrata nella mia risposta e descritta qui https://msdn.microsoft.com/en-us/library/ee693615.aspx – mattk

risposta

4

Non ho trovato un modo per utilizzare un SearchFilter per trovare messaggi di posta elettronica in base all'indirizzo di posta elettronica del destinatario.

È possibile utilizzare un sovraccarico diverso di ExchangeService.FindItems che richiede una querystring.

Trovare una mail in cui un indirizzo è nei campi A o Cc

var contactEmailAddress = "[email protected]"; 

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

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

Trovare una mail in cui un indirizzo è in Da, A o campi Cc

var contactEmailAddress = "[email protected]"; 

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

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

penso questa funzione richiede Exchange 2010.

Alcune risorse aggiuntive sulla sintassi di query:

5

Potrebbe essere perché non si accede alla cartella corretta, vale a dire: articoli inviati.

Sostituire

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

Con

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

Edit: ho frainteso la domanda iniziale. Forse si dovrebbe dare un'occhiata al seguente blog 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 Spiega come effettuare ricerche complesse utilizzando EWS

+1

Questo non è un problema. La cartella di posta in arrivo contiene le e-mail che devono essere recuperate tramite EWS. È possibile trovare e-mail nella posta in arrivo ma non filtrarli per indirizzo del destinatario quando si utilizza l'API SearchFilter. – mattk

+0

Modificata la mia risposta – Fabien

+0

Grazie a @Fabien, Sì, ho quindi capito che INBOX => SENTITEMS problema, ma non riesco ancora a filtrare le e-mail inviate a un destinatario specifico dalla cartella SentItems. Ho controllato il tuo link, offre facilità di ricerca per ==,! =, <, > ma non come in_array. Ho bisogno di qualcosa di simile per verificare se esiste un indirizzo email in RecipientsArray. puoi per favore guidarmi. –

1

Si noti che non è possibile estendere le FindItems metodo o la FindItem operazione per recuperare le proprietà e gli elementi aggiuntivi come ad esempio ToRecipients, CcRecipients e BccRecipients. Se è necessario recuperare tali valori, utilizzare il metodo FindItems o l'operazione FindItem per ottenere gli ID oggetto delle e-mail e quindi utilizzare il metodo Bind o l'operazione GetItem per recuperare le proprietà richieste. Rif: MSDN Email properties

Ecco come ho fatto:

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 
     } 

    }` 
Problemi correlati