实现 FlushQueues 方法

适用于:Outlook 2013 | Outlook 2016

MAPI 后台处理程序使用 IXPLogon::FlushQueues 方法下载任何挂起的消息并将其上传到传输提供程序和从传输提供程序上传。 通常,MAPI 后台处理程序将刷新登录到会话的所有传输提供程序的队列,从用户配置文件的传输顺序部分设置的第一个传输提供程序开始。 刷新队列几乎始终是用户直接请求的结果,因此在队列刷新时发送和接收消息与 MAPI 后台处理程序同步。 由于这些调用是同步的,因此传输提供程序应尽快处理它们。

传输提供程序必须按照以下步骤顺序处理 FlushQueues 调用,以便启用正确的消息处理,并使其他传输提供程序(如调制解调器)能够用作 MAPI 后台处理程序 FlushQueues 操作的一部分的外部资源。

步骤 组件 实现
1. MAPI 后台处理程序
为用户配置文件的传输顺序中列出的第一个传输提供程序调用 FlushQueues 方法,并在 ulFlags 参数中传递请求的标志。 FlushQueues 调用一次,并为整个上传和下载操作设置了所有标志。
2. 传输提供程序
在从 FlushQueues 调用返回之前,需要执行一些操作。 如果之前提交的消息延迟,则应使用设置NOTIFY_SENT_DEFERRED标志调用 IMAPISupport::SpoolerNotify 方法。 请注意,MAPI 后台处理程序可以取消在传输提供程序有机会完成消息处理之前已延迟的消息。 如果传输提供程序使用调制解调器等外部资源,则应建立与外部资源的连接。 必须使用 IMAPISupport::ModifyStatusRow 方法设置传输提供程序的状态行的 PR_STATUS_CODE (PidTagStatusCode) 属性中的STATUS_OUTBOUND_FLUSH位。 然后,传输提供程序应为 FlushQueues 调用返回S_OK。
3. MAPI 后台处理程序
检查传输提供程序的状态行中的STATUS_OUTBOUND_FLUSH位,并为队列中的第一条消息调用 IXPLogon::SubmitMessage
4. 传输提供程序
处理消息并从 SubmitMessage 调用返回。
5. MAPI 后台处理程序
如果传输提供程序从 SubmitMessage 返回S_OK,则 MAPI 后台处理程序将调用 IXPLogon::EndMessage 作为消息,就像对常规消息发送一样。 如果传输提供程序从 SubmitMessage 返回S_OK以外的值,则 MAPI 后台处理程序在调用 EndMessage 或再次调用 SubmitMessage 之前会相应地处理该值。
6. 传输提供程序
EndMessage 返回,其消息处理状态在 lpulFlags 参数中。
7. MAPI 后台处理程序和传输提供程序
SubmitMessage- EndMessage 循环一直持续到队列中的所有消息下载完毕。
8. MAPI 后台处理程序
通过调用已设置 NOTIFY_END_OUTBOUND_FLUSH 标志的传输提供程序的 IXPLogon::TransportNotify 方法,通知传输提供程序已完成消息下载。
9. 传输提供程序
释放用于发送出站消息的任何外部资源,以便其他传输提供程序可以使用它们刷新其队列。 必须使用 ModifyStatusRow 设置传输提供程序状态行的 PR_STATUS_CODE 属性中的STATUS_INBOUND_FLUSH位。
10. MAPI 后台处理程序
检查传输提供程序的状态行中的STATUS_INBOUND_FLUSH位,并调用 IXPLogon::StartMessage (如果已设置)。
11. 传输提供程序
处理消息并从 StartMessage 返回。 如果传输提供程序有其他要上传的消息,则应调用设置了 NOTIFY_NEWMAIL 标志的 SpoolerNotify 。 如果传输提供程序没有要上传的消息,则应对 MAPI 后台处理程序在 StartMessage 中传递的消息调用 IMAPIProp::SaveChanges 并返回。
12. MAPI 后台处理程序
继续调用 StartMessage ,直到对消息调用 SaveChanges 。 传输提供程序完成上传后,MAPI 后台处理程序调用具有NOTIFY_END_INBOUND_FLUSH标志集的 TransportNotify
13. 传输提供程序
使用 ModifyStatusRow 清除其状态行的 PR_STATUS_CODE 属性中的STATUS_INBOUND_FLUSH位,并释放所有外部资源,使其可供其他传输提供程序使用。
14. MAPI 后台处理程序
为用户配置文件的传输顺序中列出的下一个传输提供程序调用 FlushQueues

如果客户端应用程序对传输提供程序的状态对象调用 IMAPIStatus::FlushQueues ,则传输提供程序应使用 ModifyStatusRow 在其状态行中设置相应的位。 然后,MAPI 后台处理程序在 MAPI 后台处理程序方便时调用传输提供程序的 IXPLogon::FlushQueues 方法。 当由于客户端应用程序的 IMAPIStatus ::FlushQueues 调用调用传输提供程序的 IXPLogon ::FlushQueues 方法时,该操作以异步方式对客户端应用程序进行。 否则 ,IXPLogon::FlushQueues 与 MAPI 后台处理程序同步工作。

出于性能原因,如果传输提供程序的状态行中设置了STATUS_INBOUND_FLUSH和STATUS_OUTBOUND_FLUSH标志,则 MAPI 后台处理程序只会调用传输提供程序的 FlushQueues 方法。 因此,传输提供程序可以随时通过清除STATUS_OUTBOUND_FLUSH并在其状态行中STATUS_INBOUND_FLUSH标志来停止 FlushQueues 操作。 如果 MAPI 后台处理程序正在关闭并且需要结束 FlushQueues 操作,它将调用 TransportNotify 并同时设置了NOTIFY_END_INBOUND_FLUSH标志和NOTIFY_END_OUTBOUND_FLUSH标志。 传输提供程序应释放所有外部资源并返回。