Exchange Server の WCF メール トランスポート

更新 : 2007 年 11 月

Microsoft Exchange Server の WCF (Windows Communication Foundation) メール トランスポートは、電子メール アドレスに基づく WCF エンドポイントを使用してキュー サービスを提供します。このソリューションにより、.NET Compact Framework アプリケーションと .NET Framework アプリケーションの両方で Web サービスをホストでき、電子メール サーバーが到達可能であれば、どのようなコンピュータでもそれらの Web サービスを利用できます。

Bb397812.alert_note(ja-jp,VS.90).gifメモ :

WCF は .NET Compact Framework Version 3.5 以降でサポートされます。

この機能を使用すると、次のような各種のアプリケーション シナリオを実現できます。

  • 屋外からのセキュリティで保護された通信を中央サーバーに返送し、サーバーからセキュリティで保護された通信を受信する必要のあるアプリケーション

  • エンタープライズ サーバーのデータを屋外で使用されるデバイスにプッシュするアプリケーション

  • 複数のデバイスが相互に直接通信できるピアツーピア アプリケーション

    これらのシナリオでは、複数の関係者が電子メール サーバーを媒介としてステータス情報を交換します。たとえば、一般的なゲーム アプリケーション シナリオでは、一方のプレーヤーが電子メール アドレスまたはグループ エイリアスを入力することにより、他のプレーヤーにゲームへの招待状を送信します。

  • 消失したデバイスを検索するアプリケーション

  • データをデバイスにプッシュすることによって他のアプリケーションの構成情報を更新するアプリケーション

Exchange Server の WCF メール トランスポートは、屋外で使用されるデバイスに付随する基本的な 2 つの制限を解決します。それらの制限とは、アドレス指定可能性とオフラインでデータをキューに追加する能力です。チャネル名と電子メール アドレスの組み合わせが WCF エンドポイント アドレスとなります。このアドレスは、ソケット ベースのアプリケーションにおける IP アドレスとポート番号に似ています。デバイスのアドレス指定可能性は電子メール アドレスによって処理され、アプリケーション インスタンスのアドレス指定可能性は入力チャネル名によって処理されます。このカスタム アドレッシング スキームの実装には WS-Addressing プロトコルが使用されます。

キューは Windows Mobile を搭載したデバイスのローカル データ ストアによってサポートされます。WCF キューの概要については、「キューの概要」を参照してください。

Exchange Server の WCF メール トランスポートに基づくアプリケーションでは、WCF の基本的な機能を利用できます。WCF は、各種の基になるプロトコルおよびトランスポートに対応する統一プログラミング モデルを提供し、アプリケーションのロジックと WCF エンドポイントを分離します。このプログラミング モデルには、GPRS (General Packet Radio Service)、Wi-Fi ほか電子メール サーバーにアクセス可能な各種ネットワークのサポートを含め、多くの利点があります。Exchange Server の WCF メール トランスポートを使用したアプリケーション開発は、HTTP チャネルなどの WCF チャネルを使用したアプリケーション開発と似ています。

必要条件

WCF メール トランスポートに基づくアプリケーションでは、電子メール サーバーとして Exchange Server 2007 を使用します。Exchange Server 2007 Service Pack 1 には、サービス トラフィックを WCF 電子メール固有のフォルダにリダイレクトできる管理タスクが用意されています。

Bb397812.alert_note(ja-jp,VS.90).gifメモ :

サービス トラフィックは、リダイレクトされない場合は [受信トレイ] に送信されます。

メール トランスポートは、デバイスとデスクトップ コンピュータのどちらでもサポートされます。

デバイスがキューをサポートするためには、CEMAPI (CE Messaging API) が必要です。CEMAPI は、Windows Mobile を搭載したデバイスには組み込まれていますが、Windows Embedded CE を搭載したデバイスには含まれていません。

Windows Mobile Version 5.0 以降は、Exchange Server の WCF メール トランスポートをサポートしています。Version 5.0 (ビルド 14847.2.0) より前の Windows Mobile では、ダイレクト プッシュではなく Systems Management Server (SMS) を使用して Exchange 電子メール サーバーとの同期を行っています。

Bb397812.alert_note(ja-jp,VS.90).gifメモ :

メール トランスポートは Windows Mobile 2003 for Pocket PC および Windows Mobile 2003 Second Edition for Pocket PC でもサポートされています。ただし、Windows Mobile の 5.0 より前のバージョンを搭載しているデバイスでは、メッセージ受信用に設定した ActiveSync 同期の周期が必ずしもスケジュールどおりにならない場合があります。このようなデバイスにおいては、Receive メソッドを呼び出すときのタイムアウトを指定しないか、またはタイムアウトまでの時間を長く設定することをお勧めします。Windows Mobile 2003 for Smartphone はサポートされていません。

  • デスクトップ コンピュータは、Exchange Server 2007 Web サービスを介して電子メール サーバーと直接通信します。デスクトップはキューをサポートしていません。そのため、デスクトップ コンピュータは常にオンラインである必要があります。

  • デスクトップ上のアプリケーションでは WCF のデスクトップ実装を使用します。

アーキテクチャ

メッセージング層は標準デスクトップ WCF アーキテクチャに基づいています。サービス ランタイム層は存在しません。次の図は、チャネル スタックとサポートされるプロトコルおよびバインディング要素を示しています。

Exchange Server の WCF メール トランスポートのメッセージング層
Exchange Server メール トランスポートのメッセージング層

WS-Security specification version 1.0 のサポートには、X.509 証明書を使用する SOAP メッセージ セキュリティが含まれています。

Message クラスは WS-Addressing 標準に基づいています。すべてのメッセージが非同期であり、あるデバイスから電子メール サーバーを経由して別のデバイスへ到達するだけで、返送はされません。

メッセージのシリアル化と逆シリアル化は、.NET Compact Framework ランタイムまたは .NET Framework ランタイムで処理されます。デバイス側では、アプリケーションでカスタム シリアライザを使用する必要があります。デスクトップの場合は、.NET Framework が DataContractSerializer クラスをサポートするため、シリアライザは必要ありません。ただし、アプリケーションがデバイスとデスクトップ間の通信をサポートする場合は、デバイスで使用されるものと同じシリアライザをデスクトップでも使用する必要があります。

設計

Exchange Server の WCF メール トランスポートでは、WCF エンドポイントを WCF バインディングとエンドポイント アドレスの組み合わせによって表します。WCF バインディングでは、通信に使用するパラメータを指定します。このバインディングは、トランスポート バインディング要素、エンコーディング バインディング要素、およびセキュリティ バインディング要素が含まれるバインディング要素のコレクションです。メール トランスポートを使用するアプリケーションでは、これらの要素を次のように定義します。

  • トランスポート バインディング要素は電子メール トランスポートであり、MailTransportBindingElementBase オブジェクトの派生クラスであることが必要です。

  • エンコーディング バインディング要素はテキスト エンコーディングであり、TextMessageEncodingBindingElement オブジェクトで表します。ただし、カスタム エンコーダもサポートされています。

  • セキュリティ バインディング要素は WS-Addressing に基づく要素であり、AsymmetricSecurityBindingElement オブジェクトで表します。

アプリケーションでは、これらのバインディング要素を CustomBinding オブジェクト内にインスタンス化する代わりに、MailBindingBase オブジェクトの派生クラスを使用して定義済みバインディング要素のコレクションを作成することもできます。このクラスには、電子メール トランスポート バインディング要素に加え、テキスト エンコーディング バインディング要素とオプションのメッセージ セキュリティも含まれています。

メッセージは、電子メールの本文に挿入されるか、添付ファイルとして送信されます。メッセージの [件名] にはチャネル名が示されます。メッセージの識別には、Exchange Server で使用されるメッセージ クラスが生成するカスタム WCF 電子メール チャネル スタンプが使用されます。

メッセージの送信

アプリケーションがメッセージを送信するときには、現在の出力チャネルで Send メソッドを呼び出します。したがって、出力チャネルが開いている必要があります。出力チャネルはメッセージをシリアル化し、[下書き] フォルダ内にメッセージを作成します。さらに、電子メール フィールドに適切な値を設定します。作成されたメッセージは [送信トレイ] へ移動します。ここまでの処理は、デバイスでは CEMAPI、デスクトップでは Exchange Web サービスによって実行されます。デバイスでは、ActiveSync での指定に従って [送信トレイ] 内のメッセージが他の送信メッセージと同期されます。

メッセージの受信

Exchange Server の WCF メール トランスポートに基づくアプリケーションがメッセージを受信すると、次の処理が発生します。

  1. アプリケーションが入力チャネルを開きます。

  2. 入力チャネルが Receive メソッドを呼び出し、メッセージのリッスンを開始します。

  3. Exchange 電子メール サーバーは、WCF 電子メール チャネル スタンプが付いたメッセージを受信すると、自動的に [受信トレイ] と同じレベルの [サービス電子メール] フォルダへ転送します。

    Bb397812.alert_note(ja-jp,VS.90).gifメモ :

    Exchange 電子メール サーバーが WCF Exchange Server サービス メールを [サービス電子メール] フォルダへ転送するように構成されていない場合は、代わりに [受信トレイ] が使用されます。

  4. メール イベントをリッスンしている入力チャネルは、[サービス電子メール] フォルダまたは [受信トレイ] フォルダ内に到着した個々のメッセージをチェックします。

    入力チャネルは、メッセージをリッスンしている間、コードをブロックします。

  5. 入力チャネルは、メッセージ内に一致するチャネル名がある場合、メッセージを取得し、コードのブロックを解除します。

同じトランスポート上の複数の入力チャネルに対して Receive メソッドを呼び出すことができます。ブロッキングは、Receive が同一スレッド上の同じ入力チャネルに対して 2 回目に呼び出された場合にのみ発生します。

Bb397812.alert_note(ja-jp,VS.90).gifメモ :

チャネル リスナには、それぞれ 1 つの入力チャネルのみを関連付けることができます。チャネル リスナに対する AcceptChannel メソッドの 2 回目の呼び出しは、最初の入力チャネルが閉じるまで終了しません。

処理の柔軟性を高めるために、電子メール トランスポートによるメッセージの処理方法をメッセージのサイズごとに変更することができます。たとえば、メッセージのサイズが大きい場合は添付ファイルとして送信し、小さい場合は電子メールの本文に挿入できます。メッセージが大きい場合、最初の同期で完全にダウンロードされないことがあります。デバイスでは、[サービス電子メール] フォルダまたは [受信トレイ] フォルダ内のメッセージが Microsoft ActiveSync での指定に従って他の受信メッセージと同期されます。

Bb397812.alert_note(ja-jp,VS.90).gifメモ :

デバイスでは、ActiveSync の電子メール同期設定によって、最初の同期でダウンロードされるメッセージの最大サイズが決まります。メッセージが最大サイズを超える場合は、最初の同期で本文の一部だけがダウンロードされます。メッセージの一部だけがダウンロードされ、チャネル リスナがそのメッセージを待っている場合、そのメッセージには全体のダウンロードが必要であることを示すマークが付きます。次の同期セッションでメッセージの全体がダウンロードされます。

メッセージを受信するときには、Message クラスの FromEmailAddress カスタム プロパティを使用して送信者の電子メール アドレスを取得できます。このプロパティの使用方法を次の例に示します。

System.ServiceModel.Channels.Message m;
String senderAddress;
m = input.Receive();
senderAddress = m.Properties.ContainsKey("FromEmailAddress")

メッセージの削除

アプリケーションがメッセージを要求し、受信すると、そのメッセージは直ちに削除されます。処理が完了した受信メッセージの削除プロセスはプラットフォームによって異なります。

Windows Mobile を搭載したデバイスでは、受信メッセージは次の手順で削除されます。

  1. 入力チャネルが Receive メソッドを呼び出した後でメッセージを取得します。

  2. メール トランスポートが取得したメッセージを Windows Mobile 搭載のデバイス上のメッセージ ストアから削除する呼び出しを発行します。

  3. 次に電子メール同期が発生したときに、メッセージがサーバーから削除されます。

デスクトップでは、受信メッセージは次の手順で削除されます。

  1. 入力チャネルが Receive メソッドを呼び出した後でメッセージを取得します。

  2. メール トランスポートが取得したメッセージを削除済みメッセージ キャッシュ (メール トランスポート固有の内部キャッシュ) に格納します。

  3. 次のクエリ間隔で、メール トランスポートが削除済みメッセージ キャッシュをチェックします。

    クエリ間隔は、ServerQueryInterval プロパティによって決定されます。

  4. 削除済みメッセージ キャッシュ内にメッセージがある場合、メール トランスポートがサーバーに対してキャッシュ内のメッセージの削除を要求するコマンドを含むクエリを発行します。

  5. このクエリの実行中、メール トランスポートはサーバー イベントをチェックし、関連するメッセージをダウンロードします。

  6. メール トランスポートがダウンロードしたメッセージを処理キャッシュへ送り、アプリケーションが処理できるようにします。

デスクトップでは、以下の場合にもメール トランスポートがサーバーに対して削除済みメッセージ キャッシュ内のメッセージの削除を要求するコマンドを発行します。

  • ユーザーがメール トランスポートに関連付けられた最後の開いた入力チャネルに対して Close メソッドを呼び出した。

  • ユーザーがメール トランスポートに対して Dispose メソッドを呼び出した。

これらの操作は同期操作であり、CloseDispose はメッセージがサーバーから削除されるまでコードをブロックします。メッセージの削除に要する時間は、対象となるメッセージの数によって変わります。このプロセスの実行中にエラーが発生した場合、メール トランスポートはメッセージの削除を数回試みます。

Windows Mobile を搭載したデバイスでは、メッセージ ストアがこの処理を実行します。

無効なメッセージや誤った形式のメッセージも削除されます。SOAP エンベロープが破損しているメッセージは無効と見なされ、完全に削除されます。件名の WCF 電子メール チャネル スタンプの後に不正な情報 (チャネル名に含まれるサポートされていない文字など) がある場合、そのメッセージは誤った形式のメッセージと見なされます。誤った形式のメッセージは [削除済みアイテム] フォルダに移動されます。

既定の設定

MailBindingBase クラスとその派生クラスは、定義済みバインディング要素のコレクションを表します。これらのクラスは、入力チャネルと出力チャネルの作成を容易にすることを目的としています。シナリオによっては、定義済みバインディング要素の既定値を変更する必要があります。変更が必要なプロパティが MailBindingBase または使用している派生クラスに存在しない場合は、バインディング要素を別途 CustomBinding オブジェクトで作成することができます。また、CreateBindingElements メソッドを呼び出して、MailBindingBase 内のすべてのバインディング要素を取得することもできます。

たとえば、ExchangeWebServiceMailBinding クラスでは、受信メッセージの既定の最大サイズは 65,536 バイトです。この最大サイズは、次のコードを使用して MaxReceivedMessageSize プロパティを設定することにより、100,000 バイトに増やすことができます。

binding = new ExchangeWebServiceMailBinding(Server, Credential, MailSecurityMode.Message);
bindingElems = binding.CreateBindingElements();
bindingElems.Find<ExchangeWebServiceMailTransportBindingElement>().MaxReceivedMessageSize = 100000;
binding = new CustomBinding(bindingElems);

セキュリティ

Exchange Server の WCF メール トランスポートに基づくアプリケーションは、WS-Security プロトコルに基づく SOAP メッセージ セキュリティをサポートします。このセキュリティは、HttpTransportBindingElement クラスでサポートされるデスクトップ セキュリティ機能と似ています。このセキュリティ機能には X.509 証明書が必要です。

MailBindingBase オブジェクトのサブクラスに属する定義済みバインディング要素を使用する場合、メッセージ セキュリティは使用できますが、既定では無効になっています。メッセージ セキュリティを有効にするには、Mode プロパティを使用します。既定の暗号化アルゴリズムを変更するには、AlgorithmSuite プロパティを使用します。メッセージ セキュリティが有効である場合、既定値は Basic256Rsa15 です。

Exchange Server の WCF メール トランスポートを使用するアプリケーションでサポートされるセキュリティ バインディング要素は、SecurityBindingElementAsymmetricSecurityBindingElement です。

Bb397812.alert_note(ja-jp,VS.90).gifメモ :

メッセージ セキュリティを使用すると、各メッセージのサイズが大きくなります。ExchangeWebServiceMailBinding クラスを使用し、メッセージのサイズが 45,000 バイトを超える場合は、必要に応じて MaxReceivedMessageSize プロパティの値を大きくしてください。メッセージの最大サイズを大きくする方法については、前のセクションのコード例を参照してください。

配置

Windows Mobile を搭載したデバイスには、デバイスの配置を目的として、.NET Compact Framework CAB ファイルに Exchange Server の WCF メール トランスポート DLL が含まれています。マネージ アセンブリはグローバル アセンブリ キャッシュにインストールされます。

デバイス用のメール トランスポート DLL を次に示します。

  • Microsoft.ServiceModel.Channels.Mail.dll

  • Microsoft.ServiceModel.Channels.Mail.WindowsMobile.dll

  • Netcfmail3_5.dll (CEMAPI ネイティブ ラッパー)

デバイスには .NET Compact Framework WCF DLL も含まれている必要があります。

デスクトップの配置は、.NET Compact Framework .msi セットアップ ファイルによって実行します。Exchange Server の WCF メール トランスポート機能は既定でインストールされます。メール トランスポート アセンブリは、デスクトップのグローバル アセンブリ キャッシュにインストールされます。

デスクトップ用の Exchange Server の WCF メール トランスポート DLL を次に示します。

  • Microsoft.ServiceModel.Channels.Mail.dll

  • Microsoft.ServiceModel.Channels.Mail.ExchangeWebService.dll

デスクトップには、標準デスクトップ WCF DLL も含まれている必要があります。

参照

処理手順

チュートリアル : Exchange Server の WCF メール トランスポートを使用する

その他の技術情報

Windows Communication Foundation (WCF) 開発と .NET Compact Framework