EWSを介してMS Exchangeサーバーでメールを操作します。 パート1





読者の皆さん、Habrahabrこんにちは!



これらの一連の投稿の一環として、EWSなどのテクノロジと、それを使用してMS Exchange 2007-2010サーバーに保存されているメールを操作する方法について説明します。EWSを使用することがいかに簡単で便利かを示します。



このテクノロジーに精通し、最初のプロジェクトを作成し、より複雑なメール操作で終わることから、最初から始めます。



この投稿は入門的な投稿であり、おそらくEWSに既に精通している人にとっては興味深いものではないでしょう。



はじめに



Exchange WebサービスEWS )は、MSによって開発された特別なプロトコルで、MS Exchangeを構成するメールおよびその他のコンポーネントを管理するように設計されています。 プロトコルはXMLに基づいています。 サポートされている操作と例の説明は、 ここにあります



EWSは、Exchange 2007で導入された比較的新しいテクノロジーであり、 WebDAVプロトコルに代わるものです。 MSはEWSの開発と改善に多大な努力を払っています。 今では、シンプルで直感的なAPIと優れたドキュメントを備えた強力なツールであり、MS Exchangeオブジェクトの管理の問題を解決できます。



EWSアーキテクチャを次の図に示します。







ご覧のとおり、EWSはクライアントアクセスサーバー (CAS)の役割を持つサーバーでホストされています。 このロールは、ユーザーからのリクエストの処理を担当します。 Outlook、MFCMapi、ブラウザー+ OWAなどのクライアントはすべて、CASに接続されます。 クライアントアプリケーションからの要求は、EWS機能を実装するアプリケーションが配置されているIISに分類されます。 つまり EWSはIISで「存続」し、別のプロセスまたはプロセスw3wp.exe (IISアプリケーションプールが実行されるプロセス)で実行されます。 EWSに加えて、OWA、ECP、PowerShellなどの他のアプリケーションもそこでスピンできます。



EWSは、クライアント要求とExchange内部との間のレイヤーとして機能します。 EWS要求がクライアントアプリケーションから到着すると、内部Exchange呼び出しにプロキシされ、その後、操作自体が既に実行されているメールボックスサーバーの役割に到着します



注:メールボックスの役割の内部構造については、以前の記事で少し説明しています



物理的に、EWSは.NETアセンブリのセット内にあります。 Exchange 2010からは、EWS呼び出しだけでなく、OWAも呼び出します。 つまり MSは、同じ機能コードの複数のブランチのアイデアが成功しなかったことに気付き、1つのブランチのみを残すことにしました。これにより、サポートと開発が簡素化および高速化されます。



私たちは一般的なアイデアを得たので、プログラミングに進むことができます。



開発



必要なもの:

  1. MS Exchange Server 2007-2010テスト用
  2. Visual Studio 2008-2010
最初に、空のC# コンソールプロジェクトを作成します。 次に、EWSで作業する必要があるクラス/メソッド/タイプなどの説明を含むreference'yを追加する必要があります。 Exchangeを使用している場合、これを行う最も簡単な方法は、 Web参照を追加することです。 VS 2010では、プロジェクトを選択し、[ サービスの追加を追加]を選択し、[ 詳細 ] 、[ Web参照追加]を選択し、 URLフィールドでテストサーバーのアドレスをhttps:// [サーバー名] /EWS/Services.wsdlの形式で指定する必要があります 次のようになります。







[次へ]をクリックすると、参照のダウンロードが開始されます。すべてがうまくいくと、この参照の名前を示すように求められ、最後にプロジェクトに追加されます。



これで、サーバーへの接続を試みることができます。 そして、最初に行う必要があるのは、 ExchangeServiceBindingオブジェクトを取得することです。これはおそらくEWSで最も重要なオブジェクトです。有効なメソッドがすべて呼び出され、クライアント側の特定の接続を識別します。 このオブジェクトを作成するには、次の方法を使用できます。



public static ExchangeServiceBinding GetBinding( String server, String domain, String user, String password) { var esb = new ExchangeServiceBinding(); //    esb.Credentials = new NetworkCredential(user, password, domain); //     EWS esb.Url = "https://" + server + "/EWS/Exchange.asmx"; esb.RequestServerVersionValue = new RequestServerVersion(); //   Exchange  //  Exchange 2007 SP1  2010  Exchange2007_SP1 //  Exchange 2007  SP   Exchange2007 esb.RequestServerVersionValue.Version = ExchangeVersionType.Exchange2007_SP1; return esb; }
      
      





注:サーバーが自己署名証明書を使用している場合、次の理由で機能しません。 そのような証明書は検証に合格しません。 回避策として、証明書に追加の適用コードを追加できます。



 ServicePointManager.ServerCertificateValidationCallback = (obj, certificate, chain, errors) => true;
      
      





ExchangeServiceBindingを使用すると、たとえばメッセージを送信するなど、有用なことを試みることができます。 MSDNは、このためにCreateItemTypeオブジェクトを使用するよう指示しています。 これを行うには、次のメソッドを記述します。



 public static void SendMessage( ExchangeServiceBinding esb, String to, String subject, String body) { //  CreateItem request //       // ,      ,    var createItemRequest = new CreateItemType { Items = new NonEmptyArrayOfAllItemsType(), MessageDispositionSpecified = true, MessageDisposition = MessageDispositionType.SendOnly }; //  item  Message //  recipients,      var message = new MessageType(); message.ToRecipients = new EmailAddressType[1]; message.ToRecipients[0] = new EmailAddressType(); message.ToRecipients[0].EmailAddress = to; //   message.Subject = subject; //     message.Body = new BodyType(); message.Body.BodyType1 = BodyTypeType.Text; message.Body.Value = body; //   request   Item' createItemRequest.Items.Items = new ItemType[1]; createItemRequest.Items.Items[0] = message; //   CreateItemResponseType createItemResponse = esb.CreateItem(createItemRequest); //   ArrayOfResponseMessagesType responseMessages = createItemResponse.ResponseMessages; //  ,   var responseMessage = responseMessages.Items; foreach (var rmt in responseMessage.Where(rmt => rmt.ResponseClass == ResponseClassType.Error)) { throw new Exception(rmt.MessageText); } }
      
      







注:上記のコードは、メッセージを送信する最も簡単な方法を示しています。使用されるクラスの「パワー」は表示されません。 これについての詳細は、次の記事で説明するだけではありません。



このコードを呼び出すには、次のようにします。



 static void Main() { ServicePointManager.ServerCertificateValidationCallback = (obj, certificate, chain, errors) => true; try { const String server = "myserver", domain = "mydomain", user = "myuser", password = "mypassword", mailTo = "myuser2@mydomain.local", subject = "read me", body = "ehlo, developers!"; var esb = GetBinding(server, domain, user, password); SendMessage(esb, mailTo, subject, body); Console.WriteLine("Done!"); } catch (Exception e) { if(e.Message != null) Console.WriteLine(e.Message); } }
      
      







コードが恐ろしく長く実行されているように思えた場合(約5秒あります)、心配しないでください。これは最初に呼び出したときにのみ発生します。 ほとんどの場合、初期化は一度だけ実行されます。 また、これがサーバーの最初のEWS呼び出しである場合、サーバーは自身を初期化し、w3wpの新しいインスタンスを作成して要求を処理する必要があります。これには時間がかかる場合があります。



おわりに



私たちは簡単にEWSテクノロジーに精通し、宛先に手紙を送る簡単な例を書きました。



ご覧のとおり、コードは非常に簡潔で明確です。 MSのドキュメントは非常に優れており、ほとんどの場合例が含まれています。 C ++ MAPIでプログラミングした場合、この方法がどれほど簡単かを理解できます。



電子メールクライアントを作成するタスクや、Exchangeオブジェクトのリモート操作に関連するその他のタスクがある場合は、EWSを使用することをお勧めします。 なぜなら 私見この方法は、私が一緒に働かなければならなかった中で最も単純で最も理解しやすいものです。



ご清聴ありがとうございました。



継続するには...






All Articles