我希望能够从我的加载项中的功能区进行搜索,但是当我根据对话 ID 构建查询并尝试运行高级搜索时,我每次都会遇到相同的异常:
System.Runtime.InteropServices.COMException:“操作失败。”
代码如下所示:
private async void inSearchId_TextChanged(object sender, RibbonControlEventArgs e)
{
var searchText = (sender as RibbonEditBox).Text;
if (searchText.Length < 5) return; // No point searching until theres a decent query to search against
var conversationLinks = await GetConversationsBySearch(searchText);
var filter = BuildFilterFromConversationIds(conversationLinks);
Search search = _app.AdvancedSearch("inbox", filter, true, "CustomQuery");
search.Results.Sort("[ReceivedTime]", OlSortOrder.olDescending);
}
BuildFilterFromConversationIds 的返回值为
@SQL="http://schemas.microsoft.com/mapi/proptag/0x3013001E" = '22E6722D04D84704B28B060C1CA5AB92'
或者在另一个迭代中:
@SQL="urn:schemas:httpmail:conversationid" = '22E6722D04D84704B28B060C1CA5AB92'
两者都会引发上述错误。
我可以通过以下查询让它工作(作为测试):
urn:schemas:httpmail:subject LIKE '%Test%'
我看过很多地方,但我看不出我错过了什么。按对话 ID 搜索的查询应该是什么样子?为什么它会抛出异常?
PR_CONVERSATION_ID
属性是 0x30130102
(请注意,类型是 PT_BINARY
= 0x0102
),而不是 0x3013001E
(类型是 PT_STRING8
= 0x001E
)。
但是 OOM 不允许您搜索二进制 (
PT_BINARY
) 属性。如果使用 Redemption 是一个选项(我是它的作者),它确实允许二进制搜索。从我的头顶上掉下来:
Redemption.RDOSession session = new Redemption.RDOSession();
session.MAPIOBJECT = _app.Session.MAPIOBJECT;
var inbox = session.GetDefaultFolder(OlDefaultFolders.olFolderInbox);
var items = inbox.Items.Restrict(" ""http://schemas.microsoft.com/mapi/proptag/0x30130102"" = '22E6722D04D84704B28B060C1CA5AB92'");