Внешний процесс отправляет сообщения электронной почты в почтовый ящик 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 не работают должным образом.
Интересно ... что произойдет, если вы используете 'FindItems' с' SearchFilter'? 'Фильтр SearchFilter = новый SearchFilter.IsGreaterThan (ItemSchema.DateTimeReceived, DateTime.Now-1);' –
Хороший вопрос. Я подам ваше предложение и посоветую. –
@MarekFekete Пожалуйста, просмотрите аннотации, отражающие результаты вашего предложения. Кажется, есть тонкая ошибка или идиосинкразия с ключевыми словами «вчера» и «сегодня» AQS. –