このトピックでは、メール クライアントが PidTagAttachDataBinary プロパティにアクセスして、POP3 アカウントのメッセージダウンロード履歴を取得する方法について説明します。
メッセージのダウンロード履歴を取得する理由
Outlook 用の Post Office Protocol (POP) プロバイダーを使用すると、ユーザーはローカル デバイスで新しい電子メール メッセージを取得およびダウンロードし、その後、メール サーバー上でこれらの電子メール メッセージを残したり削除したりできます。 メール クライアントは、ダウンロードする新しいメッセージを確認するときに、その受信トレイの新しいメッセージのみを識別してダウンロードできる必要があります。 メール クライアントは、まず UIDL (一意の ID リスト) コマンドを使用してこれを行います。このコマンドは、その受信トレイに一意の識別子 (UID) に配信された各メッセージのマップを取得します。 クライアントは、そのクライアントの受信トレイに対してダウンロードまたは削除されたメッセージのメッセージダウンロード履歴も取得します。 メッセージ UID マップとダウンロード履歴を使用して、クライアントは履歴に存在しないメッセージを新しいメッセージとして識別できるため、ダウンロードする必要があります。
受信トレイのメッセージダウンロード履歴を取得するには:
このトピックの手順に従って、特定の形式に従うバイナリ ラージ オブジェクト (BLOB) の履歴を含む PidTagAttachDataBinary プロパティを見つけます。
引き続き 、POP3 アカウントのメッセージダウンロード履歴の解析に進みます。この BLOB を解析して、その受信トレイに対してダウンロードまたは削除されたメッセージを識別する方法について説明します。
メッセージのダウンロード履歴を特定するための重要な概念
受信トレイのメッセージダウンロード履歴は、受信トレイの非表示メッセージの添付ファイルにバイナリ MAPI プロパティ PidTagAttachDataBinary に格納されます。 表 1 は、メッセージのダウンロード履歴を見つける方法を理解するのに役立つ概念のリソースを示しています。
表 1. 中心概念
記事のタイトル | 説明 |
---|---|
MAPI 非表示フォルダー |
MAPI を使用すると、メール クライアントは非表示のフォルダーと非表示のメッセージに情報を格納できます。 非表示のフォルダーは MAPI フォルダーの関連付けられた部分にあり、通常、ユーザーが操作するのとは見えない情報が含まれています。 クライアントは、非表示のフォルダー内の非表示メッセージに格納する形式と内容を決定します。 |
MAPI メッセージ |
MAPI は、クライアントのユーザーに表示される標準 IPM サブツリー内、またはサブツリーの外部に表示され、ユーザーには表示されないフォルダーにメッセージを格納します。 メッセージには、添付ファイルに追加のデータを格納できます。ファイル、別のメッセージ、または OLE オブジェクトの形式にすることができます。 メッセージのダウンロード履歴の場合、履歴は、別の非表示メッセージに添付されているメッセージのプロパティに格納されます。 |
メッセージ プロパティの概要 |
クライアントは、メッセージに情報を格納するときに、実際にはメッセージのプロパティに情報を格納します。 MAPI では、多くのプロパティがサポートされています。一部は常に存在し、クライアントによって設定できます。他のプロパティは省略可能です。また、クライアントはそれらを使用可能にすることも、有効な値に設定することもできません。 メッセージのダウンロード履歴は、非表示メッセージへの添付ファイルの PidTagAttachDataBinary プロパティに格納されます。 |
MAPI プロファイル |
セッションのログオン時に、メール クライアントは、使用するプロバイダーとサービスを説明するプロファイルを選択します。 プロファイルは、プロパティを含むセクションに分割されます。 特に、 PidTagSearchKey (PR_SEARCH_KEY) プロパティと PidTagProfileName (PR_PROFILE_NAME) プロパティは常に存在します。 プロファイルの検索キーはすべてのプロファイルの中で一意であり、 MUID_PROFILE_INSTANCE (MAPIGUID で定義されている) によって識別されるプロファイル セクションに格納されます。H). IMAPISession::OpenProfileSection を使用してセクションを開き、IMAPIProp::GetProps を使用してプロパティ値を取得します。 |
コンテンツ テーブル |
メッセージ ストア プロバイダーは、フォルダーのコンテンツ テーブルを実装します。 フォルダーの関連付けられた部分の非表示メッセージの場合、メッセージ ストア プロバイダーは関連するコンテンツ テーブルをサポートし、クライアントは IMAPIContainer::GetContentsTable メソッドを使用して、関連付けられたコンテンツ テーブルへのポインターを返すことができます。 |
制限事項について 制限の種類 制限の構築 制限コードのサンプル |
MAPI では、クライアントは制限を使用してコンテンツ テーブルをフィルター処理し、特定のプロパティが特定の値に設定されているメッセージを表す行を検索できます。 制限は、より特殊な制限構造の和集合を含めることができる SRestriction データ構造を使用して定義されます。 IMAPITable::FindRow メソッドは、制限を適用し、制限条件に一致するテーブル内の最初の行を取得します。 |
インデックス作成用のストアの登録について |
PidTagStoreProvider (PR_MDB_PROVIDER) プロパティを使用して、ストア プロバイダーの種類を確認します。 たとえば、ストアが Exchange ストアであるかどうかを確認するために、 PidTagStoreProvider プロパティは、パブリック ヘッダー ファイル edkmdb.h で定義されている定数 pbExchangeProviderPrimaryUserGuid で表される値を返す必要があります。 |
適切な非表示のメッセージと添付ファイルの検索
受信トレイのメッセージダウンロード履歴が非表示メッセージへの添付ファイルの PidTagAttachDataBinary プロパティにあることがわかったので、適切な非表示メッセージの適切な添付ファイルを検索する手順には、次の手順が含まれます。
適切な非表示メッセージを見つける
MUID_PROFILE_INSTANCEで指定されたプロファイル セクションで、プロファイルから PidTagSearchKey (PR_SEARCH_KEY) プロパティを取得します。
IMAPIContainer::GetContentsTable を呼び出して、受信トレイ フォルダーの関連コンテンツを開きます。
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";
テーブルから、 IMAPITable::FindRow を使用して非表示のメッセージを見つけます。
手順 4 で非表示のメッセージが見つからない場合は、次に示すように、PidTagConversationKey ではなく PidTagSearchKey (PR_SEARCH_KEY) を使用するように制限を変更します。
rgRes[1].res.resProperty.ulPropTag = rgProps[0].ulPropTag = PR_SEARCH_KEY;
IMAPITable::FindRow を使用して非表示のメッセージを見つけます。
手順 6 で失敗した場合は、 PidTagSubject (PR_SUBJECT) を次の値と等しくするように制限を変更します (簡潔にスタイル置換を使用して
printf
以下に示します)。"Outlook Message Manager (%s) (KEY: %s)", PR_PROFILE_NAME, HexFromBin(PR_SEARCH_KEY)
IMAPITable::FindRow を使用して非表示のメッセージを検索します。
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 に戻ります。
手順 4、6、または 8 で見つかった非表示のメッセージを開きます。
非表示メッセージの適切な添付ファイルを見つける
非表示のメッセージには複数の添付ファイルが含まれている可能性があるため、次の順序で適切な添付ファイルを探します。
注:
この手順では、スタイルの置換を printf
使って簡潔にします。
PidTagAttachLongFilename (PR_ATTACH_LONG_FILENAME) が次の文字列と一致する添付ファイルを探します。ここで
szEmailAddress
、ユーザーの SMTP アドレスはユーザーのプロファイルで指定されています。 ."BlobPOP%s", szEmailAddress
PidTagAttachFilename (PR_ATTACH_FILENAME) が "BlobPOP%s"、
szEmailAddress
と一致する添付ファイルを探します。PidTagDisplayName (PR_DISPLAY_NAME) が "BlobPOP%s"、
szEmailAddress
と一致する添付ファイルを探します。PidTagAttachFilename (PR_ATTACH_FILENAME) が "Blob%.8x" と
dwAcctUID
dwAcctUID
一致する添付ファイルを探PROP_ACCT_MINI_UID。 IOlkAccount::GetProp メソッドを使用して、PROP_ACCT_MINI_UID プロパティにアクセスできます。
メッセージ添付ファイルの PidTagAttachDataBinary プロパティにアクセスする
非表示メッセージの適切なメッセージ添付ファイルを見つけたら、 IMAPIProp::GetProps を使用して添付ファイルの PidTagAttachDataBinary プロパティを読み取ります。
次の手順
このトピックでは、POP3 メール クライアントの受信トレイのメッセージダウンロード履歴を見つける方法について学習しました。 この 履歴を解析して 受信トレイに対してダウンロードまたは削除されたメッセージを特定する方法については、「POP3 アカウントのメッセージダウンロード履歴の解析」を参照してください。