共用方式為


尋找 POP3 帳戶的訊息下載歷程記錄

本主題描述郵件用戶端如何存取 PidTagAttachDataBinary 屬性,以取得 POP3 帳戶的郵件下載歷程記錄。

為何要取得訊息下載歷程記錄?

Outlook 的 Post Office 通訊協定 (POP) 提供者可讓使用者在其本機裝置上擷取和下載新的電子郵件訊息,然後在郵件伺服器上留下或刪除這些電子郵件訊息。 當郵件客戶端檢查是否有要下載的新郵件時,它必須能夠識別並只下載該收件匣的新訊息。 郵件用戶端會先使用 UIDL (唯一識別符清單) 命令來執行此動作,該命令會取得每個曾經傳遞至該收件匣的郵件對應,以 (UID) 的唯一標識符。 用戶端也會取得該用戶端上 [收件匣] 已下載或刪除之訊息的訊息下載歷程記錄。 用戶端接著可以使用訊息 UID 對應和下載歷程記錄,將記錄中不存在的訊息識別為新的訊息,因此應該下載這些訊息。

若要取得收件匣的訊息下載歷程記錄:

  • 請遵循本主題中的步驟來尋找 PidTagAttachDataBinary 屬性,其中包含二進位大型物件中的歷程記錄, (BLOB) 遵循特定格式。

  • 繼續 剖析 POP3 帳戶的訊息下載歷程記錄,其中描述如何剖析此 BLOB,以識別已針對該收件匣下載或刪除的訊息。

尋找訊息下載歷程記錄時要知道的核心概念

收件匣的訊息下載歷程記錄會儲存在收件匣中隱藏訊息附件上的二進位MAPI屬性 PidTagAttachDataBinary 中。 表 1 顯示概念的資源,可協助您瞭解如何找出訊息下載歷程記錄。

表 1. Core concepts

文章標題 描述
MAPI 隱藏資料夾
MAPI 可讓郵件用戶端將資訊儲存在隱藏的資料夾和隱藏的郵件中。 隱藏的資料夾位於MAPI資料夾的相關聯部分,且通常包含使用者看不到且無法操作的資訊。 用戶端決定要儲存在隱藏資料夾中隱藏訊息的格式和內容。
MAPI 訊息
MAPI 會將訊息儲存在資料夾中,無論是在用戶端使用者可見的標準 IPM 子樹中,或是子樹外部,使用者看不到這些訊息。 訊息可以將其他數據儲存在附件中,其形式可以是檔案、另一個訊息或 OLE 物件。 在訊息下載歷程記錄的案例中,記錄會儲存在附加至另一個隱藏訊息之訊息的屬性中。
訊息屬性概觀
當用戶端將資訊儲存在訊息中時,它實際上會將資訊儲存在訊息的屬性中。 MAPI 支援許多屬性,有些屬性一律存在且可由客戶端設定,有些則是選擇性的,而客戶端無法預期這些屬性可供使用或設定為有效的值。 訊息下載歷程記錄會儲存在隱藏訊息附件的 PidTagAttachDataBinary 屬性中。
MAPI 設定檔
在工作階段的登入時間,郵件客戶端會選取描述要使用之提供者和服務的配置檔。 配置檔分成包含屬性的區段。 特別是, PidTagSearchKey (PR_SEARCH_KEY) PidTagProfileName (PR_PROFILE_NAME) 屬性一律存在。 配置檔的搜尋索引鍵在所有配置檔中都是唯一的,而且會儲存在配置檔區段中,由 MAPIGUID 中定義 的MUID_PROFILE_INSTANCE (識別。H) 。 使用 IMAPISession::OpenProfileSection 開啟 區段,並使用 IMAPIProp::GetProps 取得屬性值。
內容數據表
訊息存放區提供者會實作其資料夾的內容數據表。 對於資料夾相關聯部分中的隱藏訊息,訊息存放區提供者支持相關聯的內容數據表,而用戶端可以使用 IMAPIContainer::GetContentsTable 方法來傳回關聯內容數據表的指標。
關於限制
限制類型
建置限制
範例限制程序代碼
在MAPI中,用戶端可以使用限制來篩選內容數據表,以搜尋代表將特定屬性設定為特定值之訊息的數據列。 限制是使用 SRestriction 數據結構所定義,其可包含更特殊化限制結構的聯集。 IMAPITable::FindRow 方法會套用限制,並擷取數據表中符合限制準則的第一個數據列。
關於註冊存放區以編製索引
使用 PidTagStoreProvider (PR_MDB_PROVIDER) 屬性來驗證存放區提供者的類型。 例如,若要確認存放區是否為 Exchange 存放區, PidTagStoreProvider 屬性應該傳回常數 pbExchangeProviderPrimaryUserGuid 所代表的值,該常數定義於公用頭檔 edkmdb.h 中。

尋找適當的隱藏訊息和附件

現在我們知道收件匣的訊息下載歷程記錄位於隱藏訊息附件的 PidTagAttachDataBinary 屬性中,尋找適當隱藏訊息之適當附件的程式包含下列程式:

  1. 尋找適當的隱藏訊息

  2. 尋找隱藏訊息的適當附件

  3. 存取訊息附件的 PidTagAttachDataBinary 屬性

尋找適當的隱藏訊息

  1. 在 MUID_PROFILE_INSTANCE 指定的配置檔區段中,從配置檔取得 PidTagSearchKey (PR_SEARCH_KEY) 屬性。

  2. 呼叫 IMAPIContainer::GetContentsTable,以開啟 [收件匣] 資料夾的相關內容。

  3. 根據 PidTagConversationKey (PR_CONVERSATION_KEY) PidTagSearchKey (PR_SEARCH_KEY) PidTagMessageClass (PR_MESSAGE_CLASS) 屬性建立限制,以取得包含收件匣相關內容中所有隱藏訊息的數據表。 以下是從 尋找 POP3 UIDL 歷程記錄中擷取的限制範例。

       SRestriction rgRes[3]; 
       SPropValue rgProps[3]; 
       rgRes[0].rt = RES_AND; 
       rgRes[0].res.resAnd.cRes = 2; 
       rgRes[0].res.resAnd.lpRes = &rgRes[1]; 
       rgRes[1].rt = RES_PROPERTY; 
       rgRes[1].res.resProperty.relop = RELOP_EQ; 
       rgRes[1].res.resProperty.ulPropTag = PR_CONVERSATION_KEY; 
       rgRes[1].res.resProperty.lpProp = &rgProps[0]; 
       rgRes[2].rt = RES_PROPERTY; 
       rgRes[2].res.resProperty.relop = RELOP_EQ; 
       rgRes[2].res.resProperty.ulPropTag = PR_MESSAGE_CLASS; 
       rgRes[2].res.resProperty.lpProp = &rgProps[1]; 
       rgProps[0].ulPropTag = PR_CONVERSATION_KEY; 
       rgProps[0].Value.bin = pVals[iSearchKey].Value.bin; // PR_SEARCH_KEY from the profile 
       rgProps[1].ulPropTag = PR_MESSAGE_CLASS; 
       rgProps[1].Value.LPSZ = (LPTSTR)"IPM.MessageManager";
    
  4. 從數據表中,使用 IMAPITable::FindRow 尋找隱藏的訊息。

  5. 如果步驟 4 找不到隱藏的訊息,請將限制變更為使用 PidTagSearchKey (PR_SEARCH_KEY) 而非 PidTagConversationKey,如下所示:

     rgRes[1].res.resProperty.ulPropTag = rgProps[0].ulPropTag = PR_SEARCH_KEY;
    
  6. 使用 IMAPITable::FindRow 尋找隱藏的訊息。

  7. 如果步驟 6 失敗,請將限制變更為使用 PidTagSubject (PR_SUBJECT) 等於下列值 (使用 printf 樣式替代來簡潔) 。

     "Outlook Message Manager (%s) (KEY: %s)", PR_PROFILE_NAME, HexFromBin(PR_SEARCH_KEY)
    
  8. 使用 IMAPITable::FindRow 尋找隱藏的訊息。

  9. 如果您執行的是 Outlook 2010 或更新版本,請分別將下列值用於 PidTagProfileName (PR_PROFILE_NAME) 和 PidTagSearchKey (PR_SEARCH_KEY) 。

     CHAR g_szGeneralKey[] = "General Key"; 
     const SBinary g_binGeneralKey = {sizeof(g_szGeneralKey), (LPBYTE)g_szGeneralKey};
    

    執行步驟 3 到 8。 如果找不到訊息,請回到原始步驟 3 到 8。

  10. 開啟步驟 4、6 或 8 中找到的隱藏訊息。

尋找隱藏訊息的適當附件

因為隱藏的訊息可能有多個附件,所以請依下列順序尋找適當的附件。

注意事項

為了簡潔起見, printf 此程式會再次使用樣式替代。

  1. 尋找 PidTagAttachLongFilename (PR_ATTACH_LONG_FILENAME) 符合下列字串的附件,其中 szEmailAddress 是使用者的 SMTP 位址,如使用者配置檔中所指定。 .

     "BlobPOP%s", szEmailAddress
    
  2. 尋找 PidTagAttachFilename (PR_ATTACH_FILENAME) 符合 “BlobPOP%s” 的附件。 szEmailAddress

  3. 尋找 PidTagDisplayName (PR_DISPLAY_NAME) 符合 “BlobPOP%s” 的附件。 szEmailAddress

  4. 尋找 PidTagAttachFilename (PR_ATTACH_FILENAME) 符合 “Blob%.8x” 的附件, dwAcctUID其中 dwAcctUID 來自 PROP_ACCT_MINI_UID。 您可以使用 IOlkAccount::GetProp 方法來存取 PROP_ACCT_MINI_UID 屬性。

存取訊息附件的 PidTagAttachDataBinary 屬性

找到隱藏訊息的適當訊息附件之後,請使用 IMAPIProp::GetProps 來讀取附件的 PidTagAttachDataBinary 屬性。

後續步驟

您已從本主題中瞭解如何找出 POP3 郵件用戶端收件匣的郵件下載歷程記錄。 請參閱 剖析 POP3 帳戶的訊息下載歷程 記錄,以瞭解如何剖析此歷程記錄,以識別已下載或刪除收件匣的訊息。

另請參閱