处理邮件存储通知
适用于:Outlook 2013 | Outlook 2016
若要注册消息存储通知,请调用 IMAPISession::Advise 或 IMsgStore::Advise 方法,并在 lpEntryID 参数的内容中指定消息存储区、文件夹或邮件条目标识符。 消息存储提供程序支持对象和表通知。 是向特定邮件存储对象注册,还是使用描述这些对象的文件夹层次结构和内容表注册,还是同时注册对象和表取决于预期看到的通知、执行操作的调用,以及邮件存储提供程序如何支持通知。
由于 MAPI 在提供程序支持通知方面具有灵活性,因此请注意,在响应来自所有消息存储提供程序的特定事件时,不会始终收到相同类型的通知。 某些消息存储提供程序根本不支持通知。 若要确定所使用的消息存储是否支持通知,请在其 PR_STORE_SUPPORT_MASK (PidTagStoreSupportMask) 属性中查找STORE_NOTIFY_OK位。
支持通知的消息存储提供程序的一端是生成“丰富”通知的提供程序;这些提供程序为所有已注册的建议源发送描述性通知。 另一端是支持有限通知的消息存储提供程序;这些提供商针对有限数量的建议源发送常规通知。
例如,如果将邮件复制到已注册以接收复制对象和对象移动通知的文件夹,则可能会收到对象复制通知,也可能不接收该对象复制通知。 是否收到它取决于:
调用以执行复制的方法。 这可以是 IMAPIFolder::CopyMessages、 IMAPIProp::CopyTo 或 IMAPIProp::CopyProps。
消息存储提供程序如何实现 copy 方法。
消息存储提供程序是否支持对文件夹进行对象复制的通知。
由于没有描述如何为消息存储提供程序实现事件通知的严格准则,因此客户端无法期望一致的行为。 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 的情况。
对于大多数(如果不是所有对象通知),请更新受影响文件夹的视图。