【问题标题】:EWS QueryString "received" date off by one dayEWS QueryString“收到”日期提前一天
【发布时间】:2016-11-02 01:57:16
【问题描述】:

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

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

虽然日期是昨天,但这段代码确实获取了今天检索到的消息,即 2016 年 10 月 24 日(不是 2016 年 10 月 23 日)。指定 today 的代码,应该获取所需的消息,实际上获取 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”实际上应该在获取收到的消息时起作用...... .今天。

我不知道为什么我们会在获取的消息中看到这种单日差异。我对消息日期解释的哪些方面处理不正确?

编辑:根据 cmets 中的建议,我修改了 FindItems 调用以使用 SearchFilter 对象,使用 DateTimeNow 减去一天(实际上是一个值24 小时 从 DateTime.Now。这创建了一个跨越 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 的解决方案,或者至少更好地了解查询字符串值未按预期工作的原因。

【问题讨论】:

  • 有趣...如果您将FindItemsSearchFilter 一起使用会发生什么? SearchFilter filter = new SearchFilter.IsGreaterThan(ItemSchema.DateTimeReceived, DateTime.Now-1);
  • 好问题。我会采纳你的建议和建议。
  • @MarekFekete 请查看反映您的建议结果的注释。似乎“昨天”和“今天”AQS 关键字有一个微妙的错误或特质。
  • 是的,好像是解析AQS查询的问题。但是,这不仅仅是关于yesterdaytoday - 你也会遇到绝对一天的问题。这很令人费解。抱歉,没有更多建议。
  • 感谢您的意见,@MarekFekete。

标签: c# date outlook exchange-server exchangewebservices


【解决方案1】:

如果您将 AQS 与 Exchange 结合使用,您可以在搜索查询中使用日期值和相对日期关键字的关系运算符。

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

>昨天

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

“日期值类型也可以与大于或小于等关系运算符进行比较,或使用范围运算符指定为范围...例如,收到:>2013 年 11 月 30 日,发送: >=yesterday, and received:12/1/2013..today 都是有效的查询字符串。”

【讨论】:

  • 谢谢,@贾斯汀。我最终不得不按照原始消息中的描述使用“SearchFilterCollection”部署包。您提供的建议只是强调了“今天”关键字的解释以某种方式被破坏的事实。
猜你喜欢
  • 2021-05-06
  • 2014-02-22
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2012-01-21
  • 2021-03-22
  • 1970-01-01
  • 2016-08-22
相关资源
最近更新 更多