【发布时间】: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 对象,使用 DateTime 值 Now 减去一天(实际上是一个值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 的解决方案,或者至少更好地了解查询字符串值未按预期工作的原因。
【问题讨论】:
-
有趣...如果您将
FindItems与SearchFilter一起使用会发生什么?SearchFilter filter = new SearchFilter.IsGreaterThan(ItemSchema.DateTimeReceived, DateTime.Now-1); -
好问题。我会采纳你的建议和建议。
-
@MarekFekete 请查看反映您的建议结果的注释。似乎“昨天”和“今天”AQS 关键字有一个微妙的错误或特质。
-
是的,好像是解析AQS查询的问题。但是,这不仅仅是关于
yesterday和today- 你也会遇到绝对一天的问题。这很令人费解。抱歉,没有更多建议。 -
感谢您的意见,@MarekFekete。
标签: c# date outlook exchange-server exchangewebservices