normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

Exchange Web Services Managed API SDK を使ってみた

前回のエントリで試した PowerShell を利用した CUI での Exchange Server への疎通はうまくいかなかった。今回は Exchange Web Services Managed API SDK の利用を検討してみた。
Exchange Web Services Managed API SDKExchange Server 2007 SP1 以降で利用可能であり、開発者側で理解しやすい API を用いて Exchange Server 側の情報を容易に操作することができる。
以下の様の NuGET で取得が可能であるため、簡単に取得することができる。今回はこちらを利用してオンプレ向けの Exchange Server に疎通を取ってみる。

上記の通り、32bit 版と 64bit 版があるので留意が必要だ。

Exchange Web Services Managed API SDK を利用した疎通を実施

Exchange Web Services Managed API SDK は NuGet 経由で取得できるため、以下の画面を参考に「Exchange」の文字列で検索して Exchange Web Services Managed API SDK を取得してほしい。
f:id:waritohutsu:20140504161809p:plain

Exchange Web Services Managed API SDK のインストール後、以下のコードを記載して Exchange Server から予定を取得する。

using System;
using System.Linq;
using Microsoft.Exchange.WebServices.Data;

namespace ExchangeConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            // エンプラ向けに古いバージョンの Exchange Server を指定だが、用途に合わせてオプション指定
            ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);

            // EWS のレスポンス情報をログに出力
            service.TraceEnabled = true;
            service.TraceFlags = TraceFlags.All;

            // 環境によっては Autodiscover が無理だが、以下に Autodiscover を推奨する記載がある
            // http://msdn.microsoft.com/en-us/library/dn467891(v=exchg.150).aspx
            // service.AutodiscoverUrl("<ユーザ名>@<ドメイン>", RedirectionUrlValidationCallback);

            // Autodiscover を設定せず、直接 URI を指定する
            service.Url = new Uri(@"https://<Exchange Server アドレス>/EWS/Exchange.asmx");
            service.Credentials = new WebCredentials("<ユーザ名>@<ドメイン>", "<パスワード>");

            // 現在からひと月前~ひと月後を指定して予定を取得する
            var folder = CalendarFolder.Bind(service, WellKnownFolderName.Calendar);
            DateTime dtStart = DateTime.Today;
            dtStart = dtStart.AddMonths(-1);
            DateTime dtEnd = dtStart.AddMonths(1);
            var view = new CalendarView(dtStart, dtEnd);
            foreach (var appointment in folder.FindAppointments(view))
            {
                Console.WriteLine("---------------------");
                Console.WriteLine("Subject = {0}", appointment.Subject);
                Console.WriteLine("Start = {0}", appointment.Start);
                Console.WriteLine("End = {0}", appointment.End);
                Console.WriteLine("IsAllDayEvent = {0}", appointment.IsAllDayEvent);
                Console.WriteLine("IsReminderSet = {0}", appointment.IsReminderSet);
                if (appointment.IsReminderSet == true)
                {
                    // appointment.IsReminderSet == true の状態で参照しないとエラーが出る
                    Console.WriteLine("ReminderDueBy = {0}", appointment.ReminderDueBy);
                }
            }

            Console.WriteLine("!!!!!!!!! end !!!!!!");
            Console.ReadLine();
        }
    }
}

上記のコードにおける「service.TraceEnabled = true; service.TraceFlags = TraceFlags.All;」の指定により、以下のように Exchange Server とのやり取りがログとして出力される。
f:id:waritohutsu:20140504201755p:plain

さらに、標準出力には以下が出力され、無事に Exchange Server から予定が取得されていることが確認できる。
f:id:waritohutsu:20140504201618p:plain