我正在尝试使用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 OR FullString的集合。
看起来我能够做到(子串最后一个char缺少AND Substring,缺少第一个char),但它肯定不能破坏它吗?
我该怎么做才能让它发挥作用?
请注意,我的代码是在VB.NET中,但我无法想象这就是问题所在。
干杯,
标记
答案 0 :(得分:5)
我发现IsEqualTo过滤器适用于From / Sender,它并不关心区分大小写的问题,所以它可能是我应该尝试开始的。
与电子邮件地址匹配的代码是:
sfilter = New SearchFilter.IsEqualTo(EmailMessageSchema.From, New EmailAddress(Message.FromAddress))
MailItems = service.FindItems(FailureFolder.Id, sfilter, iv)
我仍然不知道如何查找来自同一域的用户的所有电子邮件。
更多信息:
我真的需要通过Sender Domain进行过滤,并通过拉下整个文件夹内容并过滤.Net代码来实现。即使这会导致问题。
基本上为了保持快速和紧张,我尝试使用PropertySet提取所有数据:
New PropertySet(BasePropertySet.IdOnly, EmailMessageSchema.Sender)
过滤仍然无效,但电子邮件地址仍显示在我的项目列表视图中。事实证明,在您调用LoadPropertiesForItems之前,Message.Sender的值包含某种ActiveDirecty路径。在LoadPropertiesForItems之后,它是一个电子邮件地址。
请注意,我早先尝试在服务器上进行过滤是因为过滤必须针对字符串的ActiveDirectory路径样式进行过滤。
这一切都非常令人困惑,而且根本不是用户友好的。
如果有人知道如何通过服务器上的电子邮件域进行过滤,请告诉我们!
标记
答案 1 :(得分:0)
你的目标是什么?发件人不是一个字符串属性,所以我对ContainsSubstring的结果很奇怪并不感到惊讶。我尝试对抗Office 365并且它可以工作,但是旧版本的Exchange可能不像" smart"关于处理这种查询。根据您尝试实现的目标,可能会有更好的过滤器。
答案 2 :(得分:0)
if(emailSenderList.size()== 1){ 返回新的SearchFilter.IsEqualTo(EmailMessageSchema.From,emailSenderList.get(0)); }
返回新的SearchFilter.SearchFilterCollection(LogicalOperator.Or,emailSenderList.stream()。map(em - > new SearchFilter.IsEqualTo(EmailMessageSchema.From,em))。toArray(SearchFilter.IsEqualTo [] :: new)) ;