Как найти элемент электронной почты в outlook с помощью PR_SEARCH_KEY
Мне нужно решение для быстрого поиска элемента электронной почты в outlook.
Да, я мог бы перебрать все элементы, но потенциально в общих папках будут тысячи писем, а функции поиска и ограничения, по крайней мере, дают иллюзию возможного использования индексированного подхода.
Я решил использовать свойство PR_SEARCH_KEY, потому что определение подходит для этой цели, а также потому, что поле доступно при выпадении.
Но каким-то образом функции поиска и ограничения элементов не могут найти мою почту. Что странно, потому что при повторении элементов в коллекции я могу получить значение из каждого элемента и, конечно же, найти соответствующий элемент.
Что я уже пробовал:
Я построил запрос наподобие этого:
@SQL= "http://schemas.microsoft.com/mapi/proptag/0x300B0102" = 'C2C5634D92A67A4980B9D8D138DD8593'
Функция Find() для элементов в папке inbox возвращает значение null, а функция Restrict() возвращает список элементов длиной 0.
Итак, очевидно, что я делаю что-то не так со своим запросом.
Это полный код для воспроизведения (в X++, извините).
Microsoft.Office.Interop.Outlook.ApplicationClass app; Microsoft.Office.Interop.Outlook.MailItem mailItem; Microsoft.Office.Interop.Outlook.NameSpace nameSpace; Microsoft.Office.Interop.Outlook.MAPIFolder mapiFolder; Microsoft.Office.Interop.Outlook.Items items; int itemCount; int itemIdx; Microsoft.Office.Interop.Outlook.MailItem item; Microsoft.Office.Interop.Outlook.PropertyAccessor accessor; str searchKey; str subject; CLRObject property; CLRObject CLRexception; str errorString; str PR_SEARCH_KEY = "http://schemas.microsoft.com/mapi/proptag/0x300B0102"; str skey = "C2C5634D92A67A4980B9D8D138DD8593"; str filter = strFmt('@SQL= "%1" = \'%2\'', PR_SEARCH_KEY, skey); info(filter); try { app = new Microsoft.Office.Interop.Outlook.ApplicationClass(); nameSpace = app.GetNamespace("MAPI"); mapiFolder = nameSpace.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders::olFolderInbox); items = mapiFolder.get_Items(); item = items.Find(filter); if (CLRInterop::isNull(item) == false) { subject = item.get_Subject(); info("Found " + subject); } else { Error("Not found"); } itemCount = items.get_Count(); for (itemIdx = 1; itemIdx <= itemCount; itemIdx++) { item = items.get_Item(itemIdx); subject = item.get_Subject(); info(subject); accessor = item.get_PropertyAccessor(); property = accessor.GetProperty(PR_SEARCH_KEY); if (CLRInterop::isNull(property) == false) { searchKey = accessor.BinaryToString(property); info(searchKey); } } } catch( Exception::CLRError ) { //BP Deviation documented CLRexception = CLRInterop::getLastException(); while( CLRexception ) { //BP Deviation documented errorString += CLRInterop::getAnyTypeForObject( CLRexception.get_Message() ); CLRexception = CLRexception.get_InnerException(); } throw error(errorString); }
Который будет производить этот результат:
@SQL= "http://schemas.microsoft.com/mapi/proptag/0x300B0102" = 'C2C5634D92A67A4980B9D8D138DD8593'
Не найдено
тестовое сообщение 05
9E92D4BCB66C7449A3958F8D2C96626A
Информационная почта: протокол заседания ГОМ ВКЛ. Монитор
C2C5634D92A67A4980B9D8D138DD8593