Поиск журнала скачивания сообщений для учетной записи 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 вложения в скрытое сообщение, процедура поиска соответствующего вложения соответствующего скрытого сообщения включает следующие процедуры:
Поиск соответствующего скрытого сообщения
Получите свойство PidTagSearchKey (PR_SEARCH_KEY) из профиля в разделе профиля, указанном MUID_PROFILE_INSTANCE.
Откройте связанное содержимое папки "Входящие", вызвав IMAPIContainer::GetContentsTable.
Создайте ограничение на основе свойств 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";
В таблице найдите скрытое сообщение с помощью IMAPITable::FindRow.
Если на шаге 4 не удается найти скрытое сообщение, измените ограничение на использование PidTagSearchKey (PR_SEARCH_KEY) вместо PidTagConversationKey, как показано ниже:
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. Для доступа к свойству PROP_ACCT_MINI_UID можно использовать метод IOlkAccount::GetProp.
Доступ к свойству PidTagAttachDataBinary вложения сообщения
После обнаружения соответствующего вложения скрытого сообщения используйте IMAPIProp::GetProps для чтения свойства PidTagAttachDataBinary вложения.
Дальнейшие действия
Из этого раздела вы узнали, как найти журнал загрузки сообщений для папки "Входящие" почтового клиента POP3. См . раздел Анализ журнала загрузки сообщений для учетной записи POP3 , чтобы узнать, как проанализировать этот журнал, чтобы определить сообщения, которые были загружены или удалены для папки "Входящие".