MAPI について


以前、Outlook は MAPI アプリケーションである、という説明をしました。
普段使っている場合には MAPI について何も知らなくても問題はありませんが、MAPI を理解することでトラブルの対処や Outlook のプログラミングがよりスムーズにできるようになると思います。
そこで、今回は MAPI の概要を説明したいと思います。

MAPI は Messeging Application Programming Interface の略で、マイクロソフトがメッセージを送受信するアプリケーションのために作った規約です。この仕様が公開されてから 10 年以上経ちますが、バージョンは 1.0 のままです。
進化していないと考えることもできますが、それだけ柔軟性が高く、安定した仕様である証とも言えるでしょう。

MAPI では、メッセージ アプリケーションをクライアント アプリケーションサービス プロバイダに分けて定義しています。
クライアント アプリケーションはユーザー インターフェースを提供するもので、Outlook に相当します。
サービス プロバイダは実際にメッセージの送受信などを行うメッセージ サービスにアクセスするためのインターフェースを提供するものです。Exchange サーバーや POP サーバーなど、アクセスするプロトコルに違いがあっても、サービス プロバイダによってその差が吸収されます。また、MAPI の規約に従ったサービス プロバイダを独自に開発することで、独自のメッセージ サービスを Outlook などの MAPI クライアントから利用できるようになります。(Windows のデバイス ドライバのようなものと言えるでしょう。)
サービス プロバイダは提供するサービスの種類により、メッセージ ストア プロバイダトランスポート プロバイダアドレス帳プロバイダの 3 つに分類されます。
メッセージ ストア プロバイダは、メッセージなどのデータを保存するためのサービス プロバイダであり、個人用フォルダ ファイルや Exchange サーバーのメールボックス、パブリック フォルダなどがメッセージ ストア プロバイダになります。
トランスポート プロバイダは、メッセージの送受信を司るサービス プロバイダです。Exchange サーバーとの送受信を行うプロバイダや、POP/SMTP などインターネット メールの送受信を行うプロバイダ、FAX の送信を行うプロバイダなどがあります。
アドレス帳プロバイダは、名前の通りアドレス帳の機能を提供します。Outlook の連絡先をアドレス帳として使うための Outlook アドレス帳プロバイダや、Outlook 以前の Exchange クライアントなどで使われていた個人用アドレス帳のプロバイダ、LDAP サーバーをアドレス帳として使うプロバイダなどがあります。

このように、MAPI では使用するサービスに応じたプロバイダを選択して使用していくのですが、使用するサービス プロバイダとその設定をまとめたものをプロファイルと呼びます。たとえば、Exchange サーバーと POP サーバーを同時に使うというような場合、プロファイルには Exchange 用のサービス プロバイダと POP サーバー用のサービス プロバイダを使用する設定が格納されます。そして、Outlook でそのプロファイルにログオンすることにより、それぞれのサービスへアクセスできるようになります。なお、プロファイルにログオンすることを「セッションを確立する」と表現します。
既定では Outlook の最初の起動時に作成されたプロファイルに直ちにログオンしてしまうため、あまり意識することはないと思います。しかし、プロファイルを複数作成することで、自動仕分けなどのルールや既定の配信先などを切り替えることができるようになります。
また、プロファイルにはさまざまな設定が格納されるのですが、その設定に起因して問題が発生する場合があります。一般的に問題が発生すると再インストールによる対処を行う場合がありますが、プロファイルは Outlook をアンインストールしても削除されず、修復セットアップなどをしても初期化されません。そのため、再インストールで回避できない問題がプロファイルの再作成で直るということもあります。
特に Exchange サーバーを使用していないにもかかわらず、最初の起動時に誤って Exchange サーバーを使用するようにプロファイルを設定してしまった場合、プロファイルへのログオンができないため Outlook の起動すらできないということになります。その場合も、プロファイルを再作成して対処します。

なお、プロファイルに似たものにアカウントがあります。これはひとつのプロファイルで複数のトランスポート プロバイダを組み込んだ場合、どのサービスを使って送信するか指定するものですが、これは Outlook 固有の概念であり、MAPI にアカウントという概念はありません。
MAPI でメッセージを送信する際には、以下のような手順で処理が行われます。

  1. 優先順位が最も高いトランスポート プロバイダにメッセージが渡される。
  2. そのトランスポート プロバイダで送信できる受信者にメッセージを送信し、その受信者に処理済のマークをつけて返す。
  3. 優先順位が次のトランスポート プロバイダに同様にメッセージが渡される。
  4. 以降、処理済の受信者がなくなるまで 2. と 3. を繰り返す。

そのため、以前はインターネットの受信者と社内の Exchange 受信者と FAX 受信者に同一のメッセージを同時に送信する、というような芸当ができました。
しかし、Exchange が SMTP ベースで送受信を行うようになり、またひとつのプロファイルで複数のインターネット プロバイダのアカウントに接続したいという要求が出てきたため、上記のような転送方法では想定していないプロバイダで処理されてしまうケースが発生するようになりました。
そこで、Outlook 98 の「インターネット メールのみ」モードで導入されたインターネット メールのアカウントという概念が、Outlook 2002 以降は MAPI プロファイルのトランスポート プロバイダ全体に対して適用されるようになったわけですが、結果としてそれ以前にできていたインターネット メールの受信者と Exchange 受信者への同時送信ができなくなったのです。

さて、MAPI にはもうひとつ重要な概念としてプロパティというものがあります。
メッセージには件名や本文、フォルダにはフォルダ名や未読件数、受信者にはメール アドレスや表示名というように関連付けられるデータがあり、それらを MAPI ではプロパティと呼んでいます。そして、それぞれのプロパティにはそのプロパティがどのようなデータかを示すプロパティ タグという 32 ビットの ID がつけられ、そのタグとともにデータが保存されます。たとえば件名は 16 進で 0037001e というプロパティ タグで表され、テキスト形式の本文は 1000001e というタグで表されます。
基本的なプロパティについては MAPI の仕様でタグが決められており、それらを変更することはできません。そのため、ユーザーが独自のプロパティを追加したい場合には名前付きプロパティというものを使う必要があります。これらの違いについてはいずれ説明したいと思いますが、今回は割愛します。
とにかく、MAPI ではデータがプロパティとして保存され、プロパティ タグによって識別されるというわけです。

以上、MAPI の概略をざっと説明してみました。わかりにくい点などあったかもしれませんが、コメントで質問などしていただければできる限り対応したいと思います。
また、もう少し MAPI について知りたいということであれば、以下のリンクを参考にしてください。

MAPI について」への3件のフィードバック

  1. 質問です。
    MAPIを使って、outlookアカウントに送信される添付ファイルをローカルに保存するpowershellのスクリプトを作成しました。
    https://kapibara-sos.net/archives/394
    こちらを参考しています。

    powershellを作成後、.ps1ファイルを直接実行すると添付ファイルの保存ができますが
    .ps1ファイルをwindowsのタスクスケジューラで実行すると、MAPIのインスタンスが作成されません。

    試したこと:
    ・タスクスケジューラの実行権限を最上に権限にする
    ・.ps1ファイルをタスクスケジューラで実行する際には、powershellの実行権限をBypassにしている。

    よろしくお願いいたします。

コメントを残す