ぷろじぇくと、みすじら。

Filtered by Tag: Exchange

LINQ to Exchange WebDAV

Created at: | Tag: LINQ Exchange

Exchange 2000, 2003, 2007にはWebDAVでアクセスするためのインターフェースがありまして、SQLを含んだXMLを投げつけるとExchangeの中のデータを取り出せたりします。Searching Folders (WebDAV) のような感じですね。まあ2010では廃止されちゃったのですが。

さてExchange 2003のデータを.NET Frameworkのプログラムから取り出したいということがあるわけですが、今までぷちぷちSQL文字列を組み立ててXDocumentでちくちく処理していました。が、なんかめんどくさいしやっぱりLINQ使いたいですよね!!ということでLINQ プロバイダを作ってみました。死にゆくExchange 2003のための誰得LINQプロバイダです。

ダウンロード: Misuzilla.Data.ExchangeWebDav-20100703.zip (Visual Studio 2010, .NET 4)

IQueryable/IQueryProviderまわりを勉強しながらだったので何となく動くところまでしかやってないので細かいとこはアレなのと、Exchange 2003でしか動作確認していないので多分2000とか2007だとそのままでは動かないかもしれません。

使い方はExchangeDavQuerySampleを見てもらえればわかるのですが、次のようなコードでメールの一覧を取ってこれたりします。

var credential = new NetworkCredential("yui@k-on.local", "P@ssw0rd");
var baseUrl = "http://exch2k3.k-on.local/exchange/yui/受信トレイ/";

// WebDAVアクセスのためのクライアントを作成する
ExchangeWebDavClient davClient = new ExchangeWebDavClient(credential);
// LINQプロバイダを作成する
ExchangeDavQueryProvider provider = new ExchangeDavQueryProvider(davClient, baseUrl, baseUrl, TraversalType.Shallow);
provider.Log = Console.Out;

// クエリを作成する
var q = new ExchangeDavQuery<DavMessageHeaderEntry>(provider)
    .Where(x => !x.IsFolder && !x.IsHidden)
    .OrderByDescending(x => x.CreationDate)
    .Select(x => new { Subject = x.Subject, From = x.From, To = x.To });

// 実行する
foreach (var entry in q)
{
    Console.WriteLine("--------------------------------------------------");
    Console.WriteLine("Subject: {0}", entry.Subject);
    Console.WriteLine("From: {0}", entry.From);
    Console.WriteLine("To: {0}", entry.To);
}

これを実行すると以下のような結果が出てきます。

---- Query: 2010/07/03 15:57:34 ----
BaseUrl: http://192.168.0.36/exchange/yui/受信トレイ/
Start: 0, End: 49
SQL:
SELECT
    "urn:schemas:httpmail:subject", "urn:schemas:mailheader:from", "urn:schemas:mailheader:to"
FROM
    SCOPE ('SHALLOW TRAVERSAL OF "http://192.168.0.36/exchange/yui/受信トレイ/"')
WHERE
    (NOT(("DAV:isfolder" = true)) AND NOT(("DAV:ishidden" = true)))
ORDER BY
    "DAV:creationdate" DESC

---- Query End: 135.0077ms ----
--------------------------------------------------
Subject: 2010年夏合宿
From: "Tsumugi Kotobuki" <mugi@k-on.local>
To: "Yui Hirasawa" <yui@k-on.local>, "Azusa Nakano" <azunyan@k-on.local>, "Ritsu
 Tainaka" <ritsu@k-on.local>, "Mio Akiyama" <mio@k-on.local>
--------------------------------------------------
Subject: とんちゃんの写真の件
From: "Yui Hirasawa" <yui@k-on.local>
To: "Azusa Nakano" <azunyan@k-on.local>, "Tsumugi Kotobuki" <mugi@k-on.local>
--------------------------------------------------
Subject: test
From: "Yui Hirasawa" <yui@k-on.local>
To: "K-ON Club -Internal" <K-ONClub-Internal@k-on.local>

更新などには別途何か必要なのですがそうでなくても、データ取得が簡単にできるようになるので便利だと思います。どうぞご利用ください。