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));
我正尝试使用 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));