【问题标题】:EWS SearchFilter.ContainsSubstring to filter on Sender Email AddressEWS SearchFilter.ContainsSubstring 过滤发件人电子邮件地址
【发布时间】:2015-04-12 01:55:01
【问题描述】:

我正在尝试使用 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 或 FullString 的集合。

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

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

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

干杯,

标记

【问题讨论】:

    标签: vb.net exchangewebservices


    【解决方案1】:

    你的目标是什么? Sender 不是字符串属性,因此对于 ContainsSubstring 的结果很奇怪,我并不感到惊讶。我在 Office 365 上进行了尝试,它确实有效,但旧版本的 Exchange 在处理此类查询方面可能并不“聪明”。根据您要达到的目标,可能会有更好的过滤器。

    【讨论】:

    • 我注意到 From/Sender 属性不仅仅是一个简单的文本字符串,但要使用 SearchFilter,您需要一个 propertyBase 对象。发件人电子邮件地址字符串的 PropertyBase 对象是什么?我找不到。
    【解决方案2】:

    我发现 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)
    

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

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

    这一切都非常令人困惑,而且一点也不友好。

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

    标记

    【讨论】:

    • 在 Java 中 - 我使用了类似的方法,它对我有用: if(emailSenderList.size() == 1) { return new SearchFilter.IsEqualTo(EmailMessageSchema.From, emailSenderList.get(0)) ; } return new SearchFilter.SearchFilterCollection(LogicalOperator.Or, emailSenderList.stream() .map(em -> new SearchFilter.IsEqualTo(EmailMessageSchema.From, em)) .toArray(SearchFilter.IsEqualTo[] :: new) );跨度>
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-06-14
      • 1970-01-01
      • 2018-05-14
      • 2016-01-21
      • 2017-07-21
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多