Поделиться через


Поиск журнала скачивания сообщений для учетной записи POP3

В этом разделе описывается, как почтовый клиент может получить доступ к свойству PidTagAttachDataBinary для получения журнала загрузки сообщений для учетной записи POP3.

Зачем получать журнал скачивания сообщений?

Поставщик протокола POP для Outlook позволяет пользователям получать и скачивать новые сообщения электронной почты на локальном устройстве, а затем оставлять или удалять эти сообщения на почтовом сервере. Когда почтовый клиент проверяет наличие новых сообщений для скачивания, он должен иметь возможность идентифицировать и скачивать только новые сообщения для этого почтового ящика. Почтовый клиент делает это с помощью команды UIDL (Уникальное описание идентификаторов), которая получает сопоставление каждого сообщения, которое когда-либо было доставлено в папку "Входящие" с уникальным идентификатором (UID). Клиент также получает журнал загрузки сообщений, которые были загружены или удалены для папки "Входящие" на этом клиенте. Используя карту uiD сообщений и журнал загрузки, клиент может определить сообщения, отсутствующие в журнале, как новые и, следовательно, их следует скачать.

Чтобы получить журнал загрузки сообщений для папки "Входящие", выполните следующие действия:

  • Выполните действия, описанные в этом разделе, чтобы найти свойство PidTagAttachDataBinary , которое содержит журнал в двоичном большом объекте (BLOB) в определенном формате.

  • Продолжайте синтаксический анализ журнала загрузки сообщений для учетной записи 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 должно возвращать значение, представленное константой pbExchangeProviderPrimaryUserGuid, определенной в общедоступном файле заголовка edkmdb.h.

Поиск соответствующего скрытого сообщения и вложения

Теперь, когда мы знаем, что журнал загрузки сообщений для папки "Входящие" находится в свойстве PidTagAttachDataBinary вложения в скрытое сообщение, процедура поиска соответствующего вложения соответствующего скрытого сообщения включает следующие процедуры:

  1. Поиск соответствующего скрытого сообщения

  2. Поиск соответствующего вложения скрытого сообщения

  3. Доступ к свойству PidTagAttachDataBinary вложения сообщения

Поиск соответствующего скрытого сообщения

  1. Получите свойство PidTagSearchKey (PR_SEARCH_KEY) из профиля в разделе профиля, указанном MUID_PROFILE_INSTANCE.

  2. Откройте связанное содержимое папки "Входящие", вызвав IMAPIContainer::GetContentsTable.

  3. Создайте ограничение на основе свойств PidTagConversationKey (PR_CONVERSATION_KEY), PidTagSearchKey (PR_SEARCH_KEY) и PidTagMessageClass (PR_MESSAGE_CLASS), чтобы получить таблицу, содержащую все скрытые сообщения в связанном содержимом папки "Входящие". Ниже приведен пример ограничения, извлеченного из поиска журнала UIDL POP3.

       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. Для доступа к свойству PROP_ACCT_MINI_UID можно использовать метод IOlkAccount::GetProp.

Доступ к свойству PidTagAttachDataBinary вложения сообщения

После обнаружения соответствующего вложения скрытого сообщения используйте IMAPIProp::GetProps для чтения свойства PidTagAttachDataBinary вложения.

Дальнейшие действия

Из этого раздела вы узнали, как найти журнал загрузки сообщений для папки "Входящие" почтового клиента POP3. См . раздел Анализ журнала загрузки сообщений для учетной записи POP3 , чтобы узнать, как проанализировать этот журнал, чтобы определить сообщения, которые были загружены или удалены для папки "Входящие".

См. также