Обработка уведомления о хранилище сообщений

Область применения: Outlook 2013 | Outlook 2016

Чтобы зарегистрироваться для уведомлений хранилища сообщений, вызовите метод IMAPISession::Advise или IMsgStore::Advise и укажите в содержимом параметра lpEntryID идентификатор хранилища сообщений, папки или записи сообщений. Поставщики хранилища сообщений поддерживают уведомления об объектах и таблицах. Регистрация с определенными объектами хранилища сообщений, иерархией папок и таблицами содержимого, описывающими эти объекты, или с объектами и таблицами зависит от ожидаемых уведомлений, вызовов, выполняемых для выполнения операций, а также от того, как поставщик хранилища сообщений поддерживает уведомления.

Так как MAPI обеспечивает гибкость в том, как поставщики поддерживают уведомления, имейте в виду, что вы не всегда будете получать уведомления одного типа в ответ на определенное событие от всех поставщиков хранилища сообщений. Некоторые поставщики хранилища сообщений вообще не поддерживают уведомления. Чтобы определить, поддерживает ли используемое хранилище сообщений уведомление, найдите бит STORE_NOTIFY_OK в свойстве PR_STORE_SUPPORT_MASK (PidTagStoreSupportMask).

На одном конце спектра поставщиков хранилища сообщений, поддерживающих уведомления, находятся поставщики, которые создают "расширенные" уведомления; эти поставщики отправляют описательные уведомления для всех зарегистрированных источников рекомендаций. На другом конце находятся поставщики хранилища сообщений, которые поддерживают ограниченные уведомления; эти поставщики отправляют общие уведомления для ограниченного числа источников рекомендаций.

Например, если вы копируете сообщение в папку, в которой зарегистрированы уведомления о копировании объекта и перемещении объекта, вы можете получить или не получить уведомление о копировании объекта. Получение или отсутствие зависит от:

  • Метод, который вы вызвали для выполнения копирования. Это может быть IMAPIFolder::CopyMessages, IMAPIProp::CopyTo или IMAPIProp::CopyProps.

  • Как поставщик хранилища сообщений реализует метод копирования.

  • Указывает, поддерживает ли поставщик хранилища сообщений уведомления о копировании объектов в папках.

Так как нет строгих рекомендаций, описывающих, как реализовать уведомления о событиях для поставщиков хранилища сообщений, клиенты не могут ожидать согласованного поведения. MAPI дает рекомендации о том, как поставщики хранилища сообщений реализуют уведомления о событиях, и в следующей таблице описаны эти рекомендации. Прочтите таблицу следующим образом: после выполнения операции в первом столбце ожидается получение уведомления о типе, указанном во втором столбце, если вы зарегистрировались для этого типа с объектом, указанным в третьем столбце. Например, после создания папки вы получите уведомление fnevObjectCreated только в том случае, если вы зарегистрировались для уведомлений fnevObjectCreated в хранилище сообщений.

Операция Тип события Источник рекомендаций
Создание папки
fnevObjectCreated
Хранилище сообщений
Удаление папки
fnevObjectDeleted
Удаленная папка хранилища сообщений
Перемещение папки из одной папки в другую
fnevObjectMoved
Папка хранилища сообщений перемещена
Копирование папки из одной папки в другую
fnevObjectCopied
Хранилище сообщений и скопированная папка (уведомление fnevObjectCreated для новой копии папки не отправлено)
Изменение свойства вычисляемой папки (PR_SUBFOLDERS (PidTagSubfolders), PR_CONTENT_UNREAD (PidTagContentUnreadCount), PR_CONTENT_COUNT (PidTagContentCount)
fnevObjectModified
Измененная папка хранилища сообщений (нет уведомления в родительскую папку)
Создание сообщения.
fnevObjectCreated
Хранилище сообщений
Удаление сообщения, вызывающее изменение свойства PR_CONTENT_COUNT родительской папки
fnevObjectDeleted
Хранилище сообщений Удалено сообщение
Перемещение сообщения из одной папки в другую
fnevObjectMoved
Хранилище сообщений Перемещено сообщение
Копирование сообщения из одной папки в другую
fnevObjectCopied
Скопированное сообщение хранилища сообщений (уведомление no fnevObjectCreated для новой копии сообщения)
Сохранение сообщения, вызывающее изменение свойства PR_CONTENT_COUNT родительской папки
fnevObjectCreated
Хранилище сообщений только при первом сохранении
Сохранение сообщения
fnevObjectModified
Хранилище сообщений при сохранении сохраняется после первого сохранения измененного сообщения (нет уведомления в родительскую папку)
Завершение операции поиска
fnevSearchComplete
Папка поиска в хранилище сообщений
Новое сообщение
fnevNewMail
Хранилище сообщений

Примечание.

При получении уведомления об изменении объекта помните, что часть массива тегов свойств OBJECT_NOTIFICATION структуры, на которую указывает параметр lpNotifications в вызове OnNotify , может иметь значение NULL. Поставщики хранилища сообщений не обязаны вставлять сведения о свойствах в этот массив, а большинство — нет. Убедитесь, что метод OnNotify может обрабатывать случай, когда указатель lpPropTagArray имеет значение NULL.

В большинстве случаев, если не все уведомления об объектах, обновите представление затронутых папок или папок.