EWS SearchFilter.ContainsSubstring 过滤发件人电子邮件地址

EWS SearchFilter.ContainsSubstring to filter on Sender Email Address

我正尝试使用 SearchFilter.ContainsSubstring 在 Exchange Web 服务上过滤电子邮件,如下所示:

sfilter = New SearchFilter.ContainsSubstring(EmailMessageSchema.Sender, EmailAddress, ContainmentMode.Substring, ComparisonMode.IgnoreCase)
MailItems = service.FindItems(Folder.Id, sfilter, view)

不幸的是,这不起作用,我不想使用查询,因为我不能保证我可以使用 Exchange Server 2013 的功能。

在 Fiddler 中编写各种请求,我可以观察到如果我删除电子邮件地址的最后一个字符,那么过滤器会起作用,而是删除第一个字符,起作用 - 把它们放回去,坏了。

所以也许它很迂腐,它必须是一个真正的子字符串才能符合条件,所以如果我将 Containment 模式更改为 FullString - 它不起作用,所以我不能做任何像使用 Substring 的集合或全字符串。

看起来我可以做到(缺少最后一个字符的子字符串和缺少第一个字符的子字符串),但它肯定不会被破坏吧?

我该怎么做才能让它发挥作用?

请注意,我的代码在 VB.NET 中,但我无法想象这是问题所在。

干杯,

马克

你的目标是什么?发件人不是字符串 属性,所以我对 ContainsSubstring 的结果很奇怪并不感到惊讶。我在 Office 365 上尝试过它并且它起作用了,但是旧版本的 Exchange 可能不像 "smart" 那样处理这种查询。根据您要实现的目标,可能会有更好的过滤器。

我发现 IsEqualTo 过滤器适用于 From/Sender,并且它不关心区分大小写的问题,所以这可能是我应该尝试开始的。

匹配电子邮件地址的代码是:

sfilter = New SearchFilter.IsEqualTo(EmailMessageSchema.From, New EmailAddress(Message.FromAddress))
MailItems = service.FindItems(FailureFolder.Id, sfilter, iv)

不过,我仍然不知道如何查找同一域中用户的所有电子邮件。

更多信息:

我真的需要按发件人域进行过滤,并通过拉下整个文件夹内容并在 .Net 代码中进行过滤来做到这一点。即使那样也会导致问题。

基本上为了保持快速和紧凑,我尝试使用 PropertySet 提取所有数据:

New PropertySet(BasePropertySet.IdOnly, EmailMessageSchema.Sender)

过滤仍然无效,但电子邮件地址仍显示在我的项目列表视图中。事实证明,在您调用 LoadPropertiesForItems 之前,Message.Sender 的值包含某种 ActiveDirecty 路径。在 LoadPropertiesForItems 之后,它是一个电子邮件地址。

请注意,我之前在服务器上进行过滤的尝试失败了,因为过滤必须针对字符串的 ActiveDirectory 路径样式进行。

这一切都非常混乱,而且一点也不用户友好。

如果有人知道如何在服务器上按电子邮件域进行过滤,请告诉我!

马克

if(emailSenderList.size() == 1) { return 新 SearchFilter.IsEqualTo(EmailMessageSchema.From, emailSenderList.get(0)); }

return 新 SearchFilter.SearchFilterCollection(LogicalOperator.Or, emailSenderList.stream().map(em -> 新 SearchFilter.IsEqualTo(EmailMessageSchema.From, em )).toArray(SearchFilter.IsEqualTo[] :: new));