Использование MAPI API для получения определенных писем между заданными датами

Моя задача довольно проста, получить все письма между заданными датами.

Я знаю, что должен использовать вызов IMAPITable::Restrict (или указать его непосредственно для pHrQueryAllRows), но это кажется слишком сложным, учитывая API, предоставляемый Microsoft.

Учитывая структуру SRestriction (mapidefs.h):

typedef struct _SRestriction
{
    ULONG   rt;         /* Restriction type */
    union
    {
        SComparePropsRestriction    resCompareProps;    /* first */
        SAndRestriction             resAnd;
        SOrRestriction              resOr;
        SNotRestriction             resNot;
        SContentRestriction         resContent;
        SPropertyRestriction        resProperty;
        SBitMaskRestriction         resBitMask;
        SSizeRestriction            resSize;
        SExistRestriction           resExist;
        SSubRestriction             resSub;
        SCommentRestriction         resComment;
        SAnnotationRestriction      resAnnotation;  // OFFICEDEV: not backwards compatible with Office 11 and older
        SCountRestriction           resCount;       // OFFICEDEV: not backwards compatible with Office 11 and older
    } res;
} SRestriction;

Как использовать следующую структуру для получения писем между датами x и y?

Изменить:

    SPropValue* pStartTime = nullptr;
pfnMAPIAllocateBuffer_(sizeof(SPropValue),
    reinterpret_cast<LPVOID*>(&pStartTime));

ZeroMemory(pStartTime, sizeof(SPropValue));

SPropValue* pStopTime = nullptr;
pfnMAPIAllocateBuffer_(sizeof(SPropValue),
    reinterpret_cast<LPVOID*>(&pStopTime));

ZeroMemory(pStopTime, sizeof(SPropValue));

SRestriction* pConditions = nullptr;
pfnMAPIAllocateBuffer_(sizeof(SRestriction) * 2,
    reinterpret_cast<LPVOID*>(&pConditions));

pConditions[0].rt = RES_PROPERTY;
pConditions[0].res.resProperty.relop = RELOP_GT;
pStartTime->ulPropTag = 
    pConditions[0].res.resProperty.ulPropTag =
    PR_MESSAGE_DELIVERY_TIME;

//////////////
SYSTEMTIME stStart = { 0 };
stStart.wSecond=0;
stStart.wMinute=0;
stStart.wHour=9;
stStart.wDay=1;
stStart.wMonth=1;
stStart.wYear=2017;
FILETIME ftStart;
SystemTimeToFileTime(&stStart, &ftStart);
pStartTime->Value.ft = ftStart;
///////////////

pConditions[0].res.resProperty.lpProp = pStartTime;

pConditions[1].rt = RES_PROPERTY;
pConditions[1].res.resProperty.relop = RELOP_LE;
pStopTime->ulPropTag =
    pConditions[1].res.resProperty.ulPropTag = 
    PR_MESSAGE_DELIVERY_TIME;

//////////////
SYSTEMTIME stStop = { 0 };
stStop.wSecond = 0;
stStop.wMinute=12;
stStop.wHour=14;
stStop.wDay=18;
stStop.wMonth=1;
stStop.wYear=2017;
FILETIME ftStop;
SystemTimeToFileTime(&stStop, &ftStop);
pStartTime->Value.ft = ftStop;
///////////////

pConditions[1].res.resProperty.lpProp = pStopTime;

spSRestriction_.reset(new SRestriction); //#igal add deallocation
spSRestriction_->rt = RES_AND;
spSRestriction_->res.resAnd.cRes = 2;
spSRestriction_->res.resAnd.lpRes = pConditions;

person igal k    schedule 02.01.2017    source источник
comment
Это союз, поэтому вам не нужно заполнять все, только одно поле за раз. Я думаю, вам нужно ограничение И, содержащее два ограничения опоры (больше даты начала и меньше даты окончания)   -  person Oleg Bogdanov    schedule 02.01.2017


Ответы (1)


RES_AND (2, (RES_PROPERTY, RELOP_GT) (RES_PROPERTY, RELOP_LE)). Значение будет сохранено в SRestriction.lpProp.Value.ft для каждого SRestriction RES_PROPERTY.

Вы можете увидеть различные SRestriction условия, созданные Outlook или пользователем в OutlookSpy — вы можете выбрать одно из видимых найдите папки в Outlook в узле «Папки поиска» в представлении дерева папок в Outlook, нажмите кнопку IMAPIFolder на ленте OutlookSpy и перейдите на вкладку GetSearchCriteria (вкладка отображается только в папках поиска).

person Dmitry Streblechenko    schedule 03.01.2017
comment
И где я могу заполнить фактические даты? и в каком формате? - person igal k; 03.01.2017
comment
Не удалось найти эту опцию в OutLookSpy, также параметры SRestriction применяются к письмам в определенной папке или ко всем письмам? - person igal k; 12.01.2017
comment
я отредактировал свой исходный вопрос и с уважением добавил код к вашему ответу. это удовлетворительно? - person igal k; 12.01.2017
comment
Да, код выглядит нормально, но я бы выделил родительское ограничение с помощью MAPIAllocateBuffer, а дополнительные большие двоичные объекты (SPropValue и т. д.) — с помощью MAPIAllocateMore. - person Dmitry Streblechenko; 13.01.2017
comment
В OutlookSpy выберите одну из папок поиска (например, Large Mail) и нажмите кнопку IMAPIFolder. Вы не видите вкладку GetSearchCriteria? - person Dmitry Streblechenko; 13.01.2017
comment
я еще раз изменил свой код, но теперь я вообще не получаю никаких результатов, хотя я точно знаю, что меня должны запросить с несколькими положительными результатами. - person igal k; 15.01.2017
comment
NeverMind, проблема с копированием и вставкой - person igal k; 15.01.2017