jan larsen Ответов: 0

Как найти элемент электронной почты в 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

0 Ответов