次の方法で共有


IXPLogon::SubmitMessage

適用対象: Outlook 2013 | Outlook 2016

MAPI スプーラーに、トランスポート プロバイダーが配信するメッセージがあることを示します。

HRESULT SubmitMessage(
  ULONG ulFlags,
  LPMESSAGE lpMessage,
  ULONG FAR * lpulMsgRef,
  ULONG FAR * lpulReturnParm
);

パラメーター

ulFlags

[in]メッセージの送信方法を制御するフラグのビットマスク。 次のフラグを設定できます。

BEGIN_DEFERRED

MAPI スプーラーは、以前に延期されたメッセージを含むトランスポート プロバイダーを呼び出しています。 メッセージのエントリ識別子は、メッセージが延期されたときと同じです。 メッセージは、NOTIFY_SENTDEFERRED フラグを持つ IMAPISupport::SpoolerNotify メソッドを使用して、MAPI スプーラーにエントリ識別子を渡すことによって延期されました。

lpMessage

[in]トランスポート プロバイダーがそのメッセージにアクセスして操作するために使用する読み取り/書き込みアクセス許可を持つメッセージ オブジェクト (配信するメッセージを表す) へのポインター。 このオブジェクトは、トランスポート プロバイダーが 後続の IXPLogon::EndMessage メソッドの呼び出しから戻るまで有効なままになります。

lpulMsgRef

[out]トランスポート プロバイダーがこのメッセージに割り当てた参照値を返す変数へのポインター。 MAPI スプーラーは、このメッセージの後続の呼び出しでこの参照値を渡します。 MAPI スプーラーは、トランスポート プロバイダーに返す前に、値を 0 に初期化します。

lpulReturnParm

[out] SubmitMessage によって返されるMAPI_E_WAITまたはMAPI_E_NETWORK_ERRORエラー値に対応する変数へのポインター。

戻り値

S_OK

呼び出しは成功し、期待される値または値を返しました。

MAPI_E_BUSY

トランスポート プロバイダーは、別の操作を実行しているため、メッセージを処理できません。 プロバイダーは、この戻り値を使用して、処理が行われず、MAPI スプーラーが EndMessage を呼び出さないことを示す必要があります。 MAPI スプーラーは、後で SubmitMessage 呼び出しを再試行します。

MAPI_E_CANCEL

トランスポート プロバイダーは、MAPI スプーラーが以前の SpoolerNotify 呼び出しでメッセージを再送信することを要求しましたが、その後、条件が変更され、メッセージを再送信しないでください。 MAPI スプーラーは、他の処理に進みます。

MAPI_E_NETWORK_ERROR

ネットワーク エラーにより、操作が正常に完了できませんでした。 lpulReturnParm パラメーターは、MAPI スプーラーがメッセージを再送信するまでに経過する秒数に設定する必要があります。

MAPI_E_NOT_ME

トランスポート プロバイダーはこのメッセージを処理できません。 MAPI スプーラーは、その別のトランスポート プロバイダーを検索する必要があります。 プロバイダーは、この戻り値を使用して、処理が行われず、MAPI スプーラーが EndMessage を呼び出さないことを示す必要があります。

MAPI_E_WAIT

一時的な問題により、トランスポート プロバイダーがメッセージを処理できなくなります。 lpulReturnParm パラメーターは、MAPI スプーラーがメッセージを再送信するまでに経過する秒数に設定する必要があります。

注釈

MAPI スプーラーは、トランスポート プロバイダーが配信するメッセージがある場合、 IXPLogon::SubmitMessage メソッドを呼び出します。 メッセージは lpMessage パラメーターを使用してトランスポート プロバイダーに渡されます。

プロバイダーがメッセージを受け入れる準備ができている場合は、 lpulMsgRef パラメーターを使用して参照値を返し、渡されたオブジェクトを処理し、適切な値 (通常はS_OK) を返す必要があります。 プロバイダーが転送を処理する準備が整っていない場合は、エラー値を返し、必要に応じて lpulReturnParm の別の MAPI 戻り値を返して、MAPI スプーラーがメッセージを再送信するまでの待機時間を示す必要があります。

このメソッドのトランスポート プロバイダーの実装では、次のことができます。

  • メッセージを内部キューに入れて送信を待機し、メッセージをローカル ストレージにコピーして返す場合があります。

  • 実際の転送の実行を試み、転送が完了したときに、正常または失敗した場合に戻ります。

  • 関係するリソースを確認した後でメッセージを送信するかどうかを決定します。 この場合、リソースが空いている場合、プロバイダーはリソースをロックし、メッセージを準備して送信できます。 リソースがビジー状態の場合、プロバイダーはメッセージを準備し、後で送信を延期できます。

メッセージ転送に推奨される手法は、トランスポート プロバイダーと、システム リソースと競合するプロセスの予想される数によって異なります。

SubmitMessage 呼び出し中に、トランスポート プロバイダーはメッセージ オブジェクトからのメッセージ データの転送を制御します。 ただし、トランスポート プロバイダーは、データを転送する前に、 lpulMsgRef でポインターを返すメッセージに参照値を割り当てる必要があります。 これは、プロセス中の任意の時点で、MAPI スプーラーが IXPLogon::TransportNotify メソッドを呼び出し、NOTIFY_CANCEL_MESSAGE フラグを設定して、開いているオブジェクトを解放し、メッセージ転送を停止する必要があることをプロバイダーに通知できるためです。

トランスポート プロバイダーは、メッセージの転送不可のプロパティを送信しないでください。 このようなプロパティが見つかると、次のプロパティの処理に進む必要があります。 プロバイダーは、送信されたメッセージ コンテンツの一部として受信者情報MAPI_P1表示しないようにあらゆる努力をする必要があります。プロバイダーは、アドレス指定目的でのみこの受信者情報を使用する必要があります。 MAPI_P1受信者は、メッセージの再送信に使用される内部的に生成された受信者です。送信しないでください。 代わりに、他の受信者を使用して受信者情報を送信します。 この配置の目的は、再送信された受信者が元の受信者とまったく同じ受信者テーブルを表示できるようにするためです。

SubmitMessage 呼び出し中に、MAPI スプーラーは、メッセージの転送中に開かれたオブジェクトのメソッドを処理し、添付ファイルを処理します。 この処理には長い時間がかかる場合があります。 トランスポート プロバイダーは、この処理中に MAPI スプーラーの IMAPISupport::SpoolerYield メソッドを頻繁に呼び出して、他のシステム タスクの CPU 時間を解放できます。

すべてのメッセージ受信者は、MAPI スプーラーが最初に渡したメッセージの受信者テーブルに表示されます。 トランスポート プロバイダーは、エントリ識別子、アドレスの種類、またはその両方に基づいて処理できる受信者のみを処理し、 PR_RESPONSIBILITY (PidTagResponsibility) プロパティがまだ TRUE に設定されていない受信者のみを処理する必要があります。 PR_RESPONSIBILITYが既に TRUE に設定されている場合、別のトランスポート プロバイダーがその受信者を処理しています。 プロバイダーが受信者の十分な処理を完了して、その受信者のメッセージを処理できるかどうかを判断したら、渡されたメッセージでその受信者の PR_RESPONSIBILITY プロパティを TRUE に設定する必要があります。 通常、プロバイダーは、メッセージ配信が完了した後にこの決定を行います。

通常、トランスポート プロバイダーは、メッセージ データの転送が完了するまで SubmitMessage 呼び出しから戻りません。 エラーが返されない場合、MAPI スプーラーからプロバイダーへの次の呼び出しは 、IXPLogon::EndMessage メソッドの呼び出しです。

SubmitMessage がエラーを返した場合、MAPI スプーラーは変更を保存せずに処理中にメッセージを解放します。 トランスポート プロバイダーがメッセージの変更を保存する必要がある場合は、メッセージに 対して IMAPIProp::SaveChanges メソッドを呼び出してから、メッセージを返す必要があります。

トランスポートの問題が原因で発生したエラーの場合、MAPI スプーラーはメッセージを保持しますが、 lpulReturnParm で返される値に基づいて、トランスポート プロバイダーへのメッセージの再送信が遅延します。 SubmitMessage からの戻り値がMAPI_E_WAITまたはMAPI_E_NETWORK_ERRORの場合、トランスポート プロバイダーはその値を入力する必要があります。 重大なエラー状態が発生した場合、トランスポート プロバイダーは、NOTIFY_CRITICAL_ERROR フラグを使用して IMAPISupport::SpoolerNotify メソッドを呼び出す必要があります。

関連項目

IMAPIProp::SaveChanges

IMAPISupport::SpoolerNotify

IMAPISupport::SpoolerYield

IXPLogon::EndMessage

IXPLogon::TransportNotify

IXPLogon : IUnknown