第三步:擷取Folder。我們以Drafts為例。
LPSPropValue rgprops = NULL;
ULONG ulValues = 0;
//設定我們想拿哪個Folder,詳細可以查閱MSDN關於ImsgStore的介紹,在這裡我將常用的幾個Folder的屬性值列一下:
//PR_CE_IPM_DRAFTS_ENTRYID drafts,草稿箱
//PR_CE_IPM_INBOX_ENTRYID Inbox,收件匣
//PR_IPM_OUTBOX_ENTRYID Outbox,寄件匣
//PR_IPM_SENTMAIL_ENTRYID Sentbox,這個不知道叫什麼好,寄件箱?就是已經發送的訊息放的box.
//PR_IPM_WASTEBASKET_ENTRYID 垃圾箱
ULONG rgTags[] = { 1, PR_CE_IPM_DRAFTS_ENTRYID};
// 擷取Folder的Entry ID,然後通過OpenEntry獲得對象
pMsgStore->GetProps((LPSPropTagArray) rgTags, MAPI_UNICODE, &ulValues, &rgprops);
pMsgStore->OpenEntry(rgprops[0].Value.bin.cb, (LPENTRYID)rgprops[0].Value.bin.lpb, NULL, MAPI_MODIFY, NULL, (LPUNKNOWN*)pFolder );
MAPIFreeBuffer(rgprops);
這樣,我就拿到了需要的Folder,接下來還剩下最後一件事情,就是遍曆message,其實它的過程和拿Store的過程十分相似。
第四步:擷取message。
LPMAPITABLE pTable = NULL;
LPSRowSet pRows = NULL;
ULONG ulNumCols = 1;
//指定我們需要擷取Entry ID屬性
SizedSPropTagArray(ulNumCols, Columns) =
{
ulNumCols,
PR_ENTRYID
};
pFolder->GetContentsTable(0, &pTable);
hr = pTable->SetColumns((LPSPropTagArray)&Columns, 0);
//從這些代碼可以看出,和擷取Message Store的方法很相似,只不過一個是從Session對象裡拿,而另一個是從Folder裡面拿而已。
while(SUCCEEDED(pTable->QueryRows(1, 0, &pRows)))
{
LPMESSAGE pMsg = NULL;
ULONG ulMesageType;
//通過OpenEntry擷取IMessage對象
pFolder->OpenEntry( pRows->aRow[0].lpProps[0].Value.bin.cb,
(LPENTRYID)pRows->aRow[0].lpProps[0].Value.bin.lpb,
NULL,
MAPI_BEST_ACCESS,
&ulMesageType,
(LPUNKNOWN*)&pMsg);
//這裡拿到每個IMessage對象就代表了Folder裡面的每一條Message,可以通過對它的操作來擷取想要的資訊。
......
//不需要時記的釋放
pMsg->Release();
FreeProws(pRows);
pRows = NULL;
}
if(pRows)
{
FreeProws(pRows);
}
if(pTable)
{
pTable->Release();
}
終於完工了,第一次寫,不知道講的清楚不,如有不對的地方,歡迎大家指正。
無聊客
2005.8.11
yzx0023@gmail.com