EWS QueryString“收到”日期关闭一天

时间:2016-10-24 18:06:03

标签: c# date outlook exchange-server exchangewebservices

外部进程通过电子邮件将邮件发送到Exchange邮箱。然后,我有一个Exchange Web服务(EWS)2.0应用程序来获取这些电子邮件以供后续处理。 EWS应用程序旨在获取当前日期收到的消息,例如AQS用语中的"received:today"。但是,从不检索消息 - 没有返回到ItemView方法的FindItems

 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( not 10/23/2016)。指定今天的代码,其中 应该获取所需的消息,实际上已获取 no 消息:

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

实际上,显式日期的行为与'received:yesterday'和'received:today'查询字符串值完全相同,因此这意味着这些常量只是映射到我硬编码的值。

然后我怀疑时区差异或UTC转换差异,但我们的本地时区 UTC之后,这意味着指定“received:today”实际上应该用于获取收到的消息... 。今天。

我无法了解或理解为什么我们会看到这些信息在获取信息中出现这种一天的差异。消息日期解释的哪个方面我处理不正确?

编辑:根据评论中的建议,我修改了FindItems来电,使用SearchFilter对象,DateTime值为Now减去一天(实际上,来自DateTime.Now的值 24小时。这创建了一个跨越2016年10月23日的日期时间值,并检索了今天收到的消息所以我无法确定过滤器是否真的找到了这些消息,因为它们是在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的解决方案,或者至少可以更好地理解为什么查询字符串值不能按预期工作。

1 个答案:

答案 0 :(得分:1)

如果您使用AQS和Exchange,则可以在搜索查询中使用关系运算符,其中包含日期值和相对日期关键字。

虽然很奇怪,但以下表达式的工作方式与预期相对日期关键字“今天”的工作方式相同:

<强>&GT;昨天

摘自“如何:在Exchange中使用EWS执行AQS搜索”

“日期值类型也可以与关系运算符进行比较,例如大于或小于,或指定为范围运算符的范围...例如,收到:&gt; 11/30/2013,已发送:&gt; =昨天,收到:12/1 / 2013..today都是有效的查询字符串。“