Веб-службы Exchange: поиск писем, отправленных получателю
Я использую веб-службы Exchange для подключения к почтовому ящику и поиска сообщений, соответствующих определенным критериям, используя в разделе finditems С SearchFilter.
Я могу получить электронные письма в фильтрации почтовых ящиков на " от " адрес электронной почты, как это:
var service = new ExchangeService(ExchangeVersion.Exchange2010_SP1)
{
TraceEnabled = true,
Credentials = new WebCredentials(username, password)
};
var filter = new SearchFilter.ContainsSubstring(EmailMessageSchema.From, "some@email.com");
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, "some@email.com");
можно ли найти все письма, где список получателей содержит определенный адрес электронной почты?
3 ответов
это может быть потому, что вы не получаете доступ к правильной папке, то есть: отправленные элементы.
заменить
service.FindItems(WellKnownFolderName.Inbox, filter, new ItemView(50))
By
service.FindItems(WellKnownFolderName.SentItems, filter, new ItemView(50))
Edit: я неправильно понял первоначальный вопрос. Возможно, вам стоит взглянуть на следующий блог 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 Это объясняет, как сделать сложные поиски с помощью EWS
Я не нашел способ использовать SearchFilter для поиска писем на основе адреса электронной почты получателя.
возможно использование другой перегрузки ExchangeService.FindItems, который принимает строку запроса.
поиск электронных писем, где адрес находится в полях To или Cc
var contactEmailAddress = "some@email.com";
var querystring = string.Format("Participants:={0}", contactEmailAddress);
service.FindItems(WellKnownFolderName.Inbox, queryString, view);
поиск писем, где адрес находится в полях От, До или Cc
var contactEmailAddress = "some@email.com";
var querystring = string.Format("(From:={0} OR Participants:={0})", contactEmailAddress);
service.FindItems(WellKnownFolderName.Inbox, queryString, view);
Я думаю, что эта функция требует обмен 2010.
некоторые дополнительные ресурсы на синтаксис:
обратите внимание, что вы не можете расширить в разделе finditems способ или метод finditem операции для получения дополнительных свойств и элементов, таких как ToRecipients, CcRecipients и BccRecipients. Если необходимо получить эти значения, используйте метод FindItems или операцию FindItem для получения идентификаторов элементов электронной почты, а затем используйте метод Bind или операцию GetItem для получения необходимых свойств. Ссылка: свойства электронной почты MSDN
вот как я сделал это:
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
}
}`