处理邮件存储通知

适用于:Outlook 2013 | Outlook 2016

若要注册消息存储通知,请调用 IMAPISession::AdviseIMsgStore::Advise 方法,并在 lpEntryID 参数的内容中指定消息存储区、文件夹或邮件条目标识符。 消息存储提供程序支持对象和表通知。 是向特定邮件存储对象注册,还是使用描述这些对象的文件夹层次结构和内容表注册,还是同时注册对象和表取决于预期看到的通知、执行操作的调用,以及邮件存储提供程序如何支持通知。

由于 MAPI 在提供程序支持通知方面具有灵活性,因此请注意,在响应来自所有消息存储提供程序的特定事件时,不会始终收到相同类型的通知。 某些消息存储提供程序根本不支持通知。 若要确定所使用的消息存储是否支持通知,请在其 PR_STORE_SUPPORT_MASK (PidTagStoreSupportMask) 属性中查找STORE_NOTIFY_OK位。

支持通知的消息存储提供程序的一端是生成“丰富”通知的提供程序;这些提供程序为所有已注册的建议源发送描述性通知。 另一端是支持有限通知的消息存储提供程序;这些提供商针对有限数量的建议源发送常规通知。

例如,如果将邮件复制到已注册以接收复制对象和对象移动通知的文件夹,则可能会收到对象复制通知,也可能不接收该对象复制通知。 是否收到它取决于:

由于没有描述如何为消息存储提供程序实现事件通知的严格准则,因此客户端无法期望一致的行为。 MAPI 确实对消息存储提供程序如何实现事件通知提出了建议,下表概述了这些建议。 按如下所示阅读表:在第一列中执行操作后,如果已使用第三列中列出的对象注册了该类型,则预计会收到第二列中所列类型的通知。 例如,创建文件夹后,仅当已向消息存储注册 fnevObjectCreated 通知时,才会收到 fnevObjectCreated 通知。

操作 事件类型 建议来源
创建文件夹
fnevObjectCreated
消息存储
删除文件夹
fnevObjectDeleted
邮件存储已删除文件夹
将文件夹从一个文件夹移动到另一个文件夹
fnevObjectMoved
邮件存储已移动文件夹
将文件夹从一个文件夹复制到另一个文件夹
fnevObjectCopied
邮件存储和复制的文件夹 (没有为文件夹的新副本发送任何 fnevObjectCreated 通知)
更改计算文件夹属性 (PR_SUBFOLDERSpidTagSubfolders () 、 PR_CONTENT_UNREAD (PidTagContentUnreadCount) 、 PR_CONTENT_COUNT (PidTagContentCount)
fnevObjectModified
邮件存储已更改文件夹 (没有通知父文件夹)
创建消息
fnevObjectCreated
消息存储
删除邮件,导致父文件夹的 PR_CONTENT_COUNT 属性发生更改
fnevObjectDeleted
消息存储已删除邮件
将邮件从一个文件夹移到另一个文件夹
fnevObjectMoved
消息存储已移动消息
将邮件从一个文件夹复制到另一个文件夹
fnevObjectCopied
消息存储复制的消息 (无 fnevObject 创建 消息新副本)
保存邮件,导致父文件夹的 PR_CONTENT_COUNT 属性发生更改
fnevObjectCreated
仅在首次保存时的消息存储
保存消息
fnevObjectModified
第一次保存后保存的邮件存储已更改邮件 (没有通知父文件夹)
完成搜索操作
fnevSearchComplete
邮件存储搜索文件夹
新消息
fnevNewMail
消息存储

注意

收到对象修改通知时,请记住,OnNotify 调用中 lpNotifications 参数指向的 OBJECT_NOTIFICATION 结构的属性标记数组部分可能为 NULL,也可能不为 NULL。 消息存储提供程序不需要在此数组中插入属性信息,大多数提供程序不需要。 确保 OnNotify 方法可以处理 lpPropTagArray 指针为 NULL 的情况。

对于大多数(如果不是所有对象通知),请更新受影响文件夹的视图。