FlushQueues メソッドの実装

適用対象: Outlook 2013 | Outlook 2016

MAPI スプーラーは 、IXPLogon::FlushQueues メソッドを使用して、保留中のメッセージをトランスポート プロバイダーとの間でダウンロードおよびアップロードします。 通常、MAPI スプーラーは、ユーザーのプロファイルのトランスポート順序セクションで設定されている最初のトランスポート プロバイダーから開始して、セッションにログオンしているすべてのトランスポート プロバイダーのキューをフラッシュします。 キューのフラッシュは、ほとんどの場合、ユーザーによる直接要求の結果であるため、キューのフラッシュ中のメッセージの送受信は MAPI スプーラーと同期されます。 これらの呼び出しは同期的であるため、トランスポート プロバイダーは可能な限り迅速に処理する必要があります。

トランスポート プロバイダーは、適切なメッセージ処理を有効にし、モデムなどの外部リソースを MAPI スプーラーの FlushQueues 操作の一部として他のトランスポート プロバイダーが使用できるようにするには、次の一連の手順で説明するように FlushQueues 呼び出しを処理する必要があります。

手順 コンポーネント 実装
1. MAPI スプーラー
ユーザーのプロファイルのトランスポート順序にリストされている最初のトランスポート プロバイダーの FlushQueues メソッドを呼び出し、 ulFlags パラメーターで要求されたフラグを渡します。 FlushQueues は、アップロードおよびダウンロード操作全体に対してすべてのフラグが設定された状態で 1 回呼び出されます。
2. トランスポート プロバイダー
FlushQueues 呼び出しから戻る前に、さまざまな操作を行う必要があります。 以前に送信されたメッセージが遅延している場合は、NOTIFY_SENT_DEFERRED フラグを設定して IMAPISupport::SpoolerNotify メソッドを呼び出す必要があります。 MAPI スプーラーは、トランスポート プロバイダーがメッセージの処理を完了する前に延期されたメッセージを取り消す可能性があることに注意してください。 トランスポート プロバイダーがモデムなどの外部リソースを使用する場合は、外部リソースへの接続を確立する必要があります。 トランスポート プロバイダーの状態行のPR_STATUS_CODE (PidTagStatusCode) プロパティのSTATUS_OUTBOUND_FLUSH ビットは、IMAPISupport::ModifyStatusRow メソッドを使用して設定する必要があります。 その後、トランスポート プロバイダーは 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. トランスポート プロバイダー
lpulFlags パラメーターのメッセージ処理状態を持つ EndMessage からを返します。
7. MAPI スプーラーとトランスポート プロバイダー
SubmitMessage- EndMessage ループは、キュー内のすべてのメッセージがダウンロードされるまで続行されます。
8. MAPI スプーラー
NOTIFY_END_OUTBOUND_FLUSH フラグが設定されたトランスポート プロバイダーの IXPLogon::TransportNotify メソッドを呼び出して、メッセージのダウンロードが完了したことをトランスポート プロバイダーに通知します。
9. トランスポート プロバイダー
送信メッセージの送信に使用される外部リソースを解放し、他のトランスポート プロバイダーがキューをフラッシュするために使用できるようにします。 トランスポート プロバイダーの状態行のPR_STATUS_CODE プロパティの STATUS_INBOUND_FLUSH ビットは 、ModifyStatusRow を使用して設定する必要があります。
10. MAPI スプーラー
トランスポート プロバイダーの状態行でSTATUS_INBOUND_FLUSH ビットを確認し、 IXPLogon::StartMessage が設定されている場合はを呼び出します。
11. トランスポート プロバイダー
メッセージを処理し、 StartMessage からを返します。 トランスポート プロバイダーにアップロードする他のメッセージがある場合は、NOTIFY_NEWMAIL フラグを設定して SpoolerNotify を呼び出す必要があります。 トランスポート プロバイダーにアップロードするメッセージがない場合は、MAPI スプーラーが StartMessage で渡したメッセージに対して IMAPIProp::SaveChanges を呼び出して返す必要があります。
12. MAPI スプーラー
メッセージに対して SaveChanges が呼び出されるまで StartMessage の呼び出しを続けます。 トランスポート プロバイダーのアップロードが完了すると、MAPI スプーラーは、NOTIFY_END_INBOUND_FLUSH フラグを設定して TransportNotify を呼び出します。
13. トランスポート プロバイダー
ModifyStatusRow を使用して状態行のPR_STATUS_CODE プロパティのSTATUS_INBOUND_FLUSH ビットをクリアし、すべての外部リソースを解放して、他のトランスポート プロバイダーが使用できるようにします。
14. MAPI スプーラー
ユーザーのプロファイルのトランスポート順序に一覧表示されている次のトランスポート プロバイダーの FlushQueues を呼び出します。

クライアント アプリケーションがトランスポート プロバイダーの状態オブジェクトで IMAPIStatus::FlushQueues を呼び出す場合、トランスポート プロバイダーは、その状態行の適切なビットを ModifyStatusRow に設定する必要があります。 MAPI スプーラーは、MAPI スプーラーの便宜上、トランスポート プロバイダーの IXPLogon::FlushQueues メソッドを呼び出します。 トランスポート プロバイダーの IXPLogon::FlushQueues メソッドがクライアント アプリケーションの IMAPIStatus::FlushQueues 呼び出しの結果として呼び出されると、操作はクライアント アプリケーションに対して非同期的に実行されます。 それ以外の場合 、IXPLogon::FlushQueues は MAPI スプーラーと同期的に動作します。

パフォーマンス上の理由から、MAPI スプーラーは、トランスポート プロバイダーの状態行にSTATUS_INBOUND_FLUSHフラグとSTATUS_OUTBOUND_FLUSHフラグが設定されている場合にのみ、トランスポート プロバイダーの FlushQueues メソッドを呼び出します。 そのため、トランスポート プロバイダーは、状態行のSTATUS_OUTBOUND_FLUSHフラグとSTATUS_INBOUND_FLUSHフラグをクリアすることで、 FlushQueues 操作をいつでも停止できます。 MAPI スプーラーがシャットダウン中で FlushQueues 操作を終了する必要がある場合は、NOTIFY_END_INBOUND_FLUSHフラグとNOTIFY_END_OUTBOUND_FLUSH フラグセットの両方で TransportNotify を呼び出します。 トランスポート プロバイダーは、すべての外部リソースを解放して返す必要があります。