2016-10-24 2 views
0

Внешний процесс отправляет сообщения электронной почты в почтовый ящик Exchange. Затем у меня есть приложение Exchange Web Services (EWS) 2.0 для извлечения этих сообщений электронной почты для последующей обработки. Приложение EWS предназначено для получения сообщений, полученных в текущую дату, например "received:today" на языке AQS. Сообщения, однако, никогда не извлекается - ни один не вернулся в ItemView из FindItems метода:EWS QueryString «получил» дату на один день

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013); 
// sharedMailbox is a FolderId type set to a valid well-known location not reproduced here 

FindItemsResults<Item> findResults = service.FindItems(sharedMailbox,"(subject:flotsam) AND (received:today)", new ItemView(20)); 

На жаворонка, меняя эту дату «получил: вчера», наконец, поймали нужные сообщения, но осмотр явный получил дату каждого сообщения для каждого из сообщений было невчера, но сегодня:

Console.WriteLine(item.DateTimeReceived.ToLocalTime()); 
    Console.WriteLine(item.DateTimeReceived.ToUniversalTime()); 

10/24/2016 1:05:38 AM 
10/24/2016 6:05:38 AM 

Я подозревал странность в переводе констант и предпочел предоставить явные даты. Тем не менее, явно определяя дату получения в "received:MM/DD/YYYY" форме (а не «сегодня» или «вчера») показали те же результаты:

FindItemsResults<Item> findResults = service.FindItems(sharedMailbox,"(subject:flotsam) AND (received:10/23/2016)", new ItemView(20)); 

Хотя дата вчера этот код сделал Получение сообщений извлекаться сегодня, который является 10/24/2016 (не 10/23/2016). Код, указывающий сегодня, который должен получать нужные сообщения, на самом деле надуманные нет Сообщения:

FindItemsResults<Item> findResults = service.FindItems(sharedMailbox,"(subject:flotsam) AND (received:10/24/2016)", new ItemView(20)); 

В действительности, явные даты не ведут себя точно так, как «получил: вчера» и «получил: сегодня 'querystring values, так что это означает, что эти константы просто сопоставляются со значениями I, жестко закодированными.

я тогда подозревал часовой пояс различия, или различия конверсионные UTC, но наш местный часовой пояс за UTC, а это означает, что определение «получил: сегодня» должны, в действительности, работа в Fetching полученных сообщений .... сегодня.

Я затрудняюсь узнать или понять, почему мы наблюдаем это однодневное несоответствие в полученных сообщениях. Какой аспект интерпретации даты сообщения я неправильно обрабатываю?

EDIT:. За предложение в комментариях, я изменил FindItems вызов использовать SearchFilter объект, используя DateTime значение Now минус один день (на самом деле, значение 24 часа от DateTime.Now Это создало datetime значение, которое перешло в 10/23/2016, и получил полученные сообщения сегодня. Так что я не могу быть уверен, что фильтр действительно нашел сообщения, так как они были получены на 10/24, или потому, что диапазон дат поиска включен вчера (что вызвало другие поиски работы):

SearchFilter sf = new SearchFilter.IsGreaterThan(ItemSchema.DateTimeReceived, new DateTime.Now.AddDays(-1)); 

Беря реплику от этого, я изменил фильтр, чтобы использовать DateTime без явного временного элемента:

SearchFilter sf = new SearchFilter.IsGreaterThan(ItemSchema.DateTimeReceived, new DateTime(2016,10,24)); 

Этот фильтр поиска работал, возвращая оба сообщения, полученные сегодня. Это имеет тенденцию предлагать некоторые семантические икоты или неопределенности с «сегодняшними» и «вчерашними» ключевыми словами.

Я бы предпочел найти решение на основе AQS, если возможно, или, по крайней мере, найти лучшее представление о том, почему значения querystring не работают должным образом.

+1

Интересно ... что произойдет, если вы используете 'FindItems' с' SearchFilter'? 'Фильтр SearchFilter = новый SearchFilter.IsGreaterThan (ItemSchema.DateTimeReceived, DateTime.Now-1);' –

+0

Хороший вопрос. Я подам ваше предложение и посоветую. –

+0

@MarekFekete Пожалуйста, просмотрите аннотации, отражающие результаты вашего предложения. Кажется, есть тонкая ошибка или идиосинкразия с ключевыми словами «вчера» и «сегодня» AQS. –

ответ

1

Если вы используете AQS с Exchange, вам разрешено использовать реляционные операторы в поисковом запросе с значениями даты и ключевыми словами относительной даты.

Хотя странно, следующее выражение работает так, как вы ожидали относительную дату ключевое слово «сегодня» работать:

> Вчера

Выдержки из «Как: Выполнить поиск AQS с помощью встроенного web-сервера в обмене "

« Типы значений даты также могут сравниваться с операторами связи, такими как больше или меньше или заданными в качестве диапазона с оператором диапазона ... Например, полученное:> 11/30/2013, отправлено:> = вчера, и получил: 12/1/2013 ... сегодня все допустимые строки запроса. "

+0

Спасибо, @ Justin. Мне пришлось развернуть пакет, как описано в исходном сообщении, с помощью «SearchFilterCollection». Предлагаемое вами предложение просто подчеркивает тот факт, что интерпретация ключевого слова «сегодня» как-то нарушена. –

Смежные вопросы