2013-08-08 32 views
9

Tôi đang sử dụng Dịch vụ web Exchange để kết nối với hộp thư và tìm thư phù hợp với tiêu chí nhất định, sử dụng FindItems với SearchFilter.Dịch vụ Web Exchange: Tìm email được gửi đến người nhận

tôi có thể nhận email trong một hộp thư lọc theo 'từ' địa chỉ email như thế này:

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

Và tôi có thể lọc trên DisplayTo bất động sản như thế này:

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

Nhưng xa như Tôi có thể nói rằng chỉ tìm kiếm tên hiển thị của người nhận. Tôi muốn tìm kiếm trên một địa chỉ email hoặc tên miền.

này không trả lại kết quả khi tôi mong chờ nó:

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

Có thể tìm thấy tất cả các email mà danh sách người nhận có chứa một địa chỉ email cụ thể?

+0

Hình như vấn đề này vẫn còn tồn tại trong EWS API 2.2. Bạn đã tìm thấy cách giải quyết nào chưa? – 02Anant

+0

@ 02Anant Giải pháp của tôi là sử dụng FindItems với chuỗi truy vấn, được hiển thị trong câu trả lời của tôi và được mô tả ở đây https://msdn.microsoft.com/en-us/library/ee693615.aspx – mattk

Trả lời

4

tôi không tìm thấy một cách để sử dụng một SearchFilter để tìm email dựa trên địa chỉ email của người nhận.

Có thể sử dụng quá tải khác nhau của ExchangeService.FindItems, trong đó có chuỗi truy vấn.

tìm email mà địa chỉ là trong các lĩnh vực To hoặc Cc

var contactEmailAddress = "[email protected]"; 

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

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

tìm email mà địa chỉ là ở mục From, To hoặc lĩnh vực Cc

var contactEmailAddress = "[email protected]"; 

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

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

Tôi nghĩ tính năng này yêu cầu Exchange 2010.

Một số nguồn lực bổ sung về cú pháp truy vấn:

5

Có thể là do bạn không truy cập đúng thư mục, tức là: các mục đã gửi.

Thay

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

By

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

Edit: Tôi hiểu lầm câu hỏi ban đầu. Có lẽ bạn nên có một cái nhìn tại blog MSDN sau đây: 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 Nó giải thích làm thế nào để thực hiện tìm kiếm phức tạp sử dụng EWS

+1

Đó không phải là vấn đề. Thư mục hộp thư đến chứa các email cần được truy xuất bằng EWS. Bạn có thể tìm email trong hộp thư đến nhưng không thể lọc chúng theo địa chỉ người nhận khi sử dụng API SearchFilter. – mattk

+0

Đã chỉnh sửa câu trả lời của tôi – Fabien

+0

Cảm ơn @Fabien, Vâng tôi đã tìm ra rằng INBOX => SENTITEMS vấn đề, Nhưng tôi vẫn không thể lọc ra các email được gửi đến người nhận cụ thể từ thư mục SentItems. Tôi đã kiểm tra liên kết của bạn, Nó cung cấp cho cơ sở để tìm kiếm theo ==,! =, <, > vv nhưng không giống như in_array. Tôi cần ở đây một cái gì đó như để kiểm tra xem một địa chỉ email tồn tại trong RecipientsArray. bạn có thể vui lòng hướng dẫn cho tôi. –

1

Lưu ý rằng bạn không thể kéo dài tuổi FindItems phương pháp hoặc FindItem hoạt động để lấy thuộc tính bổ sung và các yếu tố chẳng hạn như ToRecipients, CcRecipientsBccRecipients. Nếu bạn cần truy xuất các giá trị đó, hãy sử dụng phương thức FindItems hoặc thao tác FindItem để lấy các ID mục của các email và sau đó sử dụng phương thức Bind hoặc hoạt động GetItem, để truy xuất các thuộc tính bắt buộc. Ref: MSDN Email properties

Sau đây là cách tôi đã làm nó:

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 
     } 

    }` 
Các vấn đề liên quan