メッセージ ストア プロバイダーを使用したメッセージ送信

適用対象: Outlook 2013 | Outlook 2016

メッセージ ストア プロバイダーは、送信メッセージの送信をサポートする必要はありません (つまり、クライアント アプリケーションがメッセージ ストア プロバイダーを使用してメッセージを送信する機能)。 クライアント アプリケーションでは、メッセージの送信中にメッセージ ストアを使用する必要があります。メッセージのデータは、ユーザーがメッセージの作成を完了してから、MAPI スプーラーがトランスポート プロバイダーにメッセージを渡して基になるメッセージング システムに送信するまでのどこかに格納する必要があるためです。 メッセージ ストア プロバイダーが送信メッセージの送信をサポートしていない場合は、既定のメッセージ ストアとして使用できません。

メッセージの送信をサポートするには、メッセージ ストア プロバイダーで次の操作を行う必要があります。

SetLockState メソッドは、MAPI スプーラーとクライアント間の適切な相互運用のために重要です。 MAPI スプーラーが送信メッセージで SetLockState を呼び出す場合、メッセージ ストア プロバイダーは、クライアントがメッセージを開かないようにする必要があります。 クライアントが MAPI スプーラーによってロックされているメッセージを開こうとした場合、メッセージ ストア プロバイダーはMAPI_E_NO_ACCESSを返す必要があります。 メッセージが MAPI スプーラーによってロックされている間にストアがシャットダウンされた場合に、メッセージのロックされた状態を永続的にする必要はありません。

MAPI スプーラーが送信メッセージをロックしているかどうかに関係なく、メッセージ ストア プロバイダーは、送信メッセージ キュー内のメッセージを書き込みのために開くことを許可しないでください。 クライアントが MAPI_MODIFY フラグを持つ送信メッセージで IMSgStore::OpenEntry メソッドを呼び出した場合、呼び出しは失敗し、MAPI_E_SUBMITTEDを返す必要があります。 クライアント アプリケーションが MAPI_BEST_ACCESS フラグを持つ送信メッセージで OpenEntry を呼び出す場合、メッセージ ストア プロバイダーはメッセージへの読み取り専用アクセスを許可する必要があります。

MAPI スプーラーによってメッセージを処理する場合、メッセージ ストア プロバイダーは、メッセージの PR_SUBMIT_FLAGS (PidTagSubmitFlags) プロパティをSUBMITFLAG_LOCKEDに設定します。 SUBMITFLAG_LOCKED値は、MAPI スプーラーが排他的に使用するためにメッセージをロックしたことを示します。 PR_SUBMIT_FLAGSのもう 1 つの値 (SUBMITFLAG_PREPROCESS) は、メッセージでトランスポート プロバイダーによって登録された 1 つ以上のプリプロセッサ関数による前処理が必要な場合に設定されます。

次の手順では、メッセージ ストア、トランスポート、および MAPI スプーラーが対話して、クライアントから 1 つ以上の受信者にメッセージを送信する方法について説明します。

クライアント アプリケーションは IMessage::SubmitMessage メソッドを 呼び出します。 SubmitMessage では、メッセージ ストア プロバイダーは次の処理を行います。

  1. IMAPISupport::P repareSubmit を呼び出します。 MAPI からエラーが返された場合、メッセージ ストア プロバイダーはそのエラーをクライアントに返します。

  2. メッセージのPR_MESSAGE_FLAGS (PidTagMessageFlags) プロパティのMSGFLAG_SUBMIT ビットを設定します。

  3. 受信者テーブルに PR_RESPONSIBILITY (PidTagResponsibility) プロパティの列があることを確認し、FALSE に設定して、トランスポートがメッセージを送信する責任をまだ負っていないことを示します。

  4. PR_CLIENT_SUBMIT_TIME (PidTagClientSubmitTime) プロパティの配信元の日付と時刻を設定します。

  5. IMAPISupport::ExpandRecips を呼び出して、次の操作を行います。

    1. すべての個人用配布リストとカスタム受信者を展開し、変更されたすべての表示名を元の名前に置き換えます。

    2. 重複する名前を削除します。

    3. 必要な前処理を確認し、前処理が必要な場合は、NEEDS_PREPROCESSING フラグと、MAPI 用に予約されている PR_PREPROCESS (PidTagPreprocess) プロパティを設定します。

    4. メッセージ ストアがトランスポートと緊密に結合されていて、すべての受信者を処理できない場合は、NEEDS_SPOOLER フラグを設定します。

  6. NEEDS_PREPROCESSING メッセージ フラグが設定されている場合は、次のタスクを実行します。

    1. PR_SUBMIT_FLAGS プロパティに SUBMITFLAG_PREPROCESS ビットが設定された送信キューにメッセージを配置します。

    2. キューが変更されたことを MAPI スプーラーに通知します。

    3. クライアントに制御を返し、メッセージ フローは MAPI スプーラーで続行されます。 MAPI スプーラーは、次のタスクを実行します。

      1. IMsgStore::SetLockState を呼び出してメッセージをロックします。

      2. すべての前処理関数を登録の順序で呼び出して、必要な前処理を実行します。 トランスポート プロバイダーは IMAPISupport::RegisterPreprocessor を呼び出して前処理関数を登録します。

      3. 開いているメッセージで IMessage::SubmitMessage を呼び出して、前処理が完了したことをメッセージ ストアに示します。

前処理がなかった場合、または前処理があり、 SubmitMessage という MAPI スプーラーがある場合、メッセージ ストア プロバイダーはクライアント プロセスで次の処理を行います。

  • メッセージ ストアがトランスポートに緊密に結合され、NEEDS_SPOOLER フラグが IMAPISupport::ExpandRecips から返された場合は、次のタスクを実行します。

    • 処理できるすべての受信者を処理します。

    • 処理するすべての受信者の PR_RESPONSIBILITY プロパティを TRUE に設定します。

    • すべての受信者がこの密結合ストアとトランスポートに認識されている場合は、次のタスクを実行します。

      • メッセージが前処理されたか、メッセージ ストア プロバイダーが MAPI スプーラーでメッセージ処理を完了する必要がある場合は、 IMAPISupport::CompleteMsg を呼び出します。 メッセージ フローは MAPI スプーラーで続行されます。

      • メッセージが前処理されなかった場合、またはメッセージ ストア プロバイダーが MAPI スプーラーにメッセージ処理を完了させたくない場合は、次のタスクを実行します。

        1. メッセージを、 PR_SENTMAIL_ENTRYID (PidTagSentMailEntryId) プロパティのエントリ識別子によって識別されるフォルダーにコピーします (設定されている場合)。

        2. PR_DELETE_AFTER_SUBMIT (PidTagDeleteAfterSubmit) プロパティが TRUE に設定されている場合は、メッセージを削除します。

        3. メッセージがロックされている場合にロックを解除します。

        4. クライアントに戻ります。 メッセージ フローが完了しました。

    • メッセージが前処理されたか、プロバイダーが MAPI スプーラーでメッセージ処理を完了する必要がある場合は、次のタスクを実行します。

      1. IMAPISupport::CompleteMsg を呼び出します。

      2. MAPI スプーラーを使用してメッセージ フローを続行します。 詳細については、「 メッセージの送信: MAPI スプーラー タスク」を参照してください。

    • メッセージが前処理されなかった場合、またはプロバイダーがスプーラーにメッセージ処理を完了させたくない場合は、次のタスクを実行します。

      1. PR_SENTMAIL_ENTRYID プロパティのエントリ識別子によって識別されるフォルダーにメッセージをコピーします (設定されている場合)。

      2. PR_DELETE_AFTER_SUBMIT プロパティが TRUE に設定されている場合は、メッセージを削除します。

      3. メッセージがロックされている場合にロックを解除します。

      4. 呼び出し元に戻ります。 メッセージ フローが完了しました。

  • メッセージ ストアがトランスポートに緊密に結合されていない場合、すべての受信者がメッセージ ストアに認識されていない場合、または NEEDS_SPOOLER フラグが設定されている場合は、次のタスクを実行します。

    1. PR_SUBMIT_FLAGS プロパティで SUBMITFLAG_PREPROCESS ビットを設定せずに、メッセージを送信キューに配置します。

    2. テーブル通知を生成して、送信キューが変更されたことを MAPI スプーラーに通知します。

    3. クライアントに戻り、メッセージ フローは MAPI スプーラーによって実行される一連のタスクで続行されます。

関連項目

  • [���b�Z�[�W�̃X�g�A�̋@�(message-store-features.md)