Outlook Interop使用多个过滤器执行服务器端搜索

问题描述 投票:0回答:1

我正在尝试使用Outlook interop从指定的发件人电子邮件地址和指定的主题通配符模式检索收件箱中的所有电子邮件,并且在尝试一次应用两个过滤器时遇到麻烦。

我担心的第一件事是过滤发生的位置。是在Exchange筛选器上还是在客户端上?当然,出于性能原因,我希望在服务器上进行过滤。我看到两个方法“ Restict”和“ Find”看起来像是用于过滤,并且接受类似SQL的过滤字符串。

我花了大部分时间尝试获取Restrict方法,但尝试创建一个过滤器并使用“ AND”子句来执行主题过滤和发件人过滤均未成功。我已经成功通过连续应用两个连续的链接Restrict函数(如下所示)而成功,但是我怀疑过滤类似于LINQ,并且在客户端上执行。这是这里发生的事吗?我是否应该能够将过滤器组合到单个复合SQL WHERE子句中?我想知道为什么主题过滤器似乎需要以架构材料作为前缀,而发件人过滤器似乎不接受相同的架构材料。此外,请注意分配给senderEmailAddress的两个值(其中之一已被注释掉)。我想使用标准的SMPT地址进行过滤,但似乎只有特定于Exchange的地址可以使用。有什么想法吗?

Application oApp = new Application();
NameSpace oNS = oApp.GetNamespace("MAPI");
MAPIFolder inbox = oNS.GetDefaultFolder(OlDefaultFolders.olFolderInbox);

subject = "%Challenge%";
//senderEmailAddress = "[email protected]"; 
senderEmailAddress = "/O=COMPANYNAME/OU=EXCHANGE ADMINISTRATIVE GROUP (FYDIBOHF23SPDLT)/CN=RECIPIENTS/CN=LANID";
string senderFilter = $"[SenderEmailAddress] = '{senderEmailAddress}'";
string subjectFilter = $"@SQL=urn:schemas:httpmail:subject LIKE '{subject}'";            
var items = inbox.Items.Restrict(senderFilter).Restrict(subjectFilter);

我将提供赏金。我希望得到的答案包括一种能够通过SMTP电子邮件地址和带有通配符的主题进行过滤的方法,该方法在服务器上进行了过滤。 (没有服务器端循环或类似LINQ的基本方法可以用一条语句执行相同的操作。)

更新1:我确实注意到我可以使用“ fromemail”属性而不是senderemailAddress进行过滤,如上所示。前者似乎需要“ schema”前缀,而后者则不需要。在不了解更多信息的情况下,我假设存在具有不同语法的不同方法,但是缺点是发件人电子邮件地址的格式如上所述不一致。

$“ AND urn:schemas:httpmail:fromemail类似于'{fromEmail}'”]

c# .net outlook interop
1个回答
0
投票
不幸的是,我没有时间自己尝试一下,但我希望无论如何都可以。根据docs,可以使用带有逻辑运算符AND,OR和NOT的过滤器。 Here是带有逻辑运算符的DASL查询的示例:

criteria = "@SQL=" & "(NOT(" _ & Chr(34) & "https://schemas.microsoft.com/mapi/string/" _ & "{00020329-0000-0000-C000-000000000046}/Order%20Date" & Chr(34) _ & " IS NULL) AND " _ & Chr(34) & "urn:schemas-microsoft-com:office:office#Company" & Chr(34) _ & " = 'Microsoft')"

上面的查询检索自定义属性Order Date不为null且CompanyName属性完全为Microsoft的所有联系人。 

如果您已经尝试过此操作,则可以再次检查语法。在我看来,您需要特别注意转义字符。

© www.soinside.com 2019 - 2024. All rights reserved.