はじめに
ビジネスアプリケーションからMicrosoft Officeを操作し、Microsoft Officeに組み込まれている大量のクラスや関数を利用できるようにすると、非常に大きなメリットがあります。Office製品に同梱されている相互運用アセンブリを用いればお馴染みの操作を実行することができ、ユーザーにとっても受け入れやすいアプリケーションになります。本稿は2部構成のシリーズのパート1です。今回は主に、.NETアプリケーションのコンテキストでOutlookを操作する方法について解説します。簡単なサンプルを作成してOutlookの相互運用クラス(特に連絡先項目の操作に関係するクラス)の使い方を習得します。また、.NETアプリケーションからOutlookを操作するときに注意すべきセキュリティ上の問題についても簡単に触れます。パート2ではOutlookをアドインによって拡張する方法、具体的にはOutlookのツールバーにカスタムボタンを追加する方法について解説します。
Redemption
Redemption DLLは、Office 2002以降に組み込まれた「Outlook Security Patch」によるセキュリティ警告(機密データと思われる情報へのアクセス時に表示される警告)を回避する手段の1つです。詳しくは後述しますが、たとえばアプリケーションからOutlookを呼び出して連絡先のメールプロパティにアクセスしようとした場合、Redemptionを使用していないと、Outlookはユーザーに対して次のメッセージを表示します。
このような警告でユーザーを煩わすことを何とも思わない人や、このようなダイアログが表示されても適切な対応ができるようにユーザーを訓練すればいいと考えている人は、以降のRedemptionに関する説明を読む必要はありません。しかし、そこまでユーザーに厳しくない開発者ならば、「機密」情報に警告なしでアクセスするメソッドをRedemptionライブラリが公開しているという事実に興味をそそられるはずです。Redemptionは開発用として無料で提供されていますが、アプリケーションに組み込んで配布するときはワンタイムライセンス料が発生します。このライブラリの詳細とDLLのダウンロードについては、こちらを参照してください。
本稿のサンプルソースは、Redemptionをダウンロードしない場合に備えてRedemptionを使用しないバージョンになっています(Redemptionを使用する場合のコードはコメントアウトされています)。また、ユーザーがセキュリティアクセス要求を拒否した場合の対応を行うエラーキャッチ機構を設けていないことにも注意してください。現実のアプリケーションではエラーキャッチ機構を設けるべきでしょう。Redemptionを使えば、これは問題になりません。
Redemptionを使用するには、このDLLをコンピュータに登録する必要があります。具体的には、DLLの置かれたフォルダに移動した後、コマンドプロンプトから次のコマンドを実行します。
さらに、ソリューション側にこのDLLへの参照を追加する必要があります。その後、Redemptionを使うコードをコメント解除すれば、警告が表示されなくなります。
準備
Outlookを操作するアプリケーションを作成するときには、OutlookのCOMライブラリへの参照を必ず追加しなければなりません。本稿のサンプルでは、Visual Studio 2005(.NET Framework 2.0)、C#.NET、およびMicrosoft Office Outlook 2003を使用します。まず、適切なOutlook COMライブラリへの参照をプロジェクトに追加します。Officeの相互運用ライブラリはVisual Studioの参照追加ダイアログの[COM]タブに表示されます。私の場合、Outlook 2003を使用している関係から、このライブラリは「Microsoft Outlook 11.0 Object Library」という名前になっています。これらの相互運用ライブラリはOfficeとともに提供されます。したがって、Outlook 2003をインストールしていれば、このライブラリが見つかるはずです。Outlook 2003ではなくOutlook 2007をインストールしている場合は、「Microsoft Outlook 12.0 Object Library」というライブラリが見つかるはずです。
さらに、Outlookの機能を利用する各クラスに次のusingディレクティブを含めます。
using Outlook = Microsoft.Office.Interop.Outlook;
サンプルプロジェクトの参照設定は、ご利用のコンピュータの構成状況に応じて適宜調整してください。
簡単なアプリケーション(Outlookの連絡先管理)の作成
Outlookの相互運用クラスの機能を理解するために「連絡先管理」アプリケーションを作成してみましょう。このアプリケーションでは、ユーザーは連絡先を表示するOutlookフォルダを選択し、名前の上にマウスポインタを合わせて個々の連絡先の情報を調べたり、連絡先の一部のプロパティを変更したりすることができます。このサンプルはOutlookのクラスを紹介することを目的としていますが、これを参考にすれば、.NETアプリケーションから独自のやり方でOutlook(ひいてはOffice)を操作することも難しくないでしょう。
見てすぐわかるように、このアプリケーションには空のリストボックスと[Get Contacts]ボタンがあります。
ユーザーがこのボタンをクリックすると、Outlookスタイルのフォルダ選択ダイアログが表示され、連絡先のインポート元となるフォルダを選択することができます。Outlookの相互運用クラスはNamespaceクラスのPickFolderというメソッドを提供しており、それを使えばこの機能を1行で実現できます。しかしその前に、Outlookの機能を公開するOutlook Applicationオブジェクトを生成し、Namespaceオブジェクトを取得する必要があります。
Outlook.Application oApp = new Outlook.Application();
Outlook.NameSpace oNS = oApp.GetNamespace("MAPI");
"MAPI"は、OutlookでGetNamespaceメソッドを使う場合のパラメータです。次のコードとスクリーンショットは、ユーザーにOutlookフォルダを選択させる方法を示しています。
private Outlook.MAPIFolder oContactsFolder = oNS.PickFolder();
今回の例では、インポートプロセスの対象を連絡先だけに限定するので、ユーザーの選択したフォルダに連絡先が含まれていないと、ユーザーは何の結果も受け取らないことになります。PickFolderメソッドはMAPIFolder型のオブジェクトを返します。目的のオブジェクトへの参照を取得したら、そのオブジェクトの各項目を反復処理します。その前に、項目を連絡先のみに限定しておきます。
string filter = "[MessageClass] = ¥"IPM.Contact¥""
Outlook.Items oContactItems = oContacts.Items.Restrict(filter);
foreach (Outlook.ContactItem oContact in oContactItems)
{}
Restrictメソッドが引数として受け取るフィルタは、項目のプロパティを参照する書式付き文字列です。[]内が検索のために照合するプロパティで、検索条件を引用符で囲みます。フィルタ文字列の作成の詳細と具体的な例については、MSDNの記事を参照してください。
ContactItemクラスは連絡先に関する次のようなプロパティを公開しています。
- LastName、FirstName、MiddleName、Title
- JobTitle
- Email1Address、Email1DisplayName、IMAddress
- WebPage
- BusinessTelephoneNumber、OtherTelephoneNumber、PagerNumber、MobileTelephoneNumber、BusinessFaxNumber
ここでは本稿のサンプルで使うものだけを掲載しましたが、この他にもさまざまなプロパティがあります。Email1Address、Email1DisplayName、IMAddressはこの中でも特別なプロパティです。これらにアクセスすると、Outlookから前述のセキュリティ警告が発せられます。他のプロパティでは警告は出ません。
今回の例では、Email1DisplayNameを用いてフォーム上のListBoxに連絡先データを割り当てます。さらに、hoverイベント(マウスオーバー時に発生するイベント)で一部のプロパティをツールチップに表示します。
ユーザーがいずれかの連絡先をダブルクリックすると、新しいフォームが開き、連絡先の情報を修正することができます。次のサンプルコードは、テキストボックスからの情報で連絡先を更新する方法を示しています。
oContact.FirstName = textBoxFirst.Text;
oContact.LastName = textBoxLast.Text;
oContact.MiddleName = textBoxMiddle.Text;
oContact.Title = textBoxTitle.Text;
oContact.JobTitle = textBoxJobTitle.Text;
oContact.WebPage = textBoxWebPage.Text;
oContact.Email1Address = textBoxEmail.Text;
oContact.Save();
Email1Addressプロパティに書き込みを行ってもセキュリティ警告が出されないことに注意してください。Outlookのセキュリティモデルは、アプリケーションによって情報が盗み出されるのを防ぐために、プロパティへの読み取りアクセスを阻止します。プロパティに新しい値を設定しただけでは、セキュリティ警告は出されません。プロパティを設定した後、SaveメソッドでOutlook内の連絡先を更新します。
連絡先へのメール送信
連絡先の使用例として、アプリケーションのフォームにメール送信ボタンを追加しましょう。ユーザーがこのボタンをクリックしたら、ListBox内の選択された連絡先にメールが自動的に送信されるようにします。このボタンのclickイベントは次のようになります。
Outlook.Application oApp = new Outlook.Application();
if (this.listViewContacts.SelectedItems != null &&
this.listViewContacts.SelectedItems.Count > 0)
{
Outlook.ContactItem oRecip = (Outlook.ContactItem)
(this.listViewContacts.SelectedItems[0].Tag);
Outlook.MailItem email = (Outlook.MailItem)
(oApp.CreateItem(Outlook.OlItemType.olMailItem));
email.Recipients.Add(oRecip.Email1Address);
email.Subject = "Just wanted to say...";
email.Body = "Have a great day!";
if (MessageBox.Show(
"Are you sure you want to send a good day message to " +
oRecip.Email1DisplayName + "?", "Send?",
MessageBoxButtons.OKCancel)
== DialogResult.OK)
{
try
{
((Outlook.MailItem)email).Send();
MessageBox.Show("Email sent successfully.", "Sent");
}
catch (Exception ex)
{
MessageBox.Show("Email failed: " + ex.Message,
"Failed Send");
}
}
oRecip = null;
email = null;
}
Redemptionを使わない場合、上記のコードもセキュリティ警告の影響を受けます。
ビジネスケース
Outlookの相互運用が効果を発揮するビジネスケースは枚挙にいとまがありません。たとえば私の開発したあるシステムでは、Outlookの相互運用とRedemptionを用いてユーザーのOutlook連絡先をインポートし、その情報をエンタープライズアプリケーション内で作られるプロジェクトと関連付けできるようにしています。これにより、ユーザーがアプリケーション固有の連絡先情報を保存できます。また、RedemptionのAddressBook機構を利用して、Active Directoryレベルでメール送信先のユーザーを選択したりユーザーをレビュープロセスに追加したりできる機能を簡単に実装しています。さらにOutlookのクラスを利用して、ユーザーがメールをOutlookコンソールから添付ファイルとしてプロジェクトへ「プッシュ」できるようなアドインも作成しています。
まとめ
本稿で紹介した機能は、Outlookの相互運用クラスで実現できること(ひいてはOfficeの統合ライブラリセットで実現できること)のほんの一部にすぎません。本稿では、Outlookのクラスを利用してユーザーの連絡先情報を操作する方法と、フォルダ選択ダイアログのような組み込み機能を利用する方法を学びました。これらのライブラリをいろいろ試してビジネスアプリケーションのニーズをどれだけ満たすことができるか、詳しく調べてみることをお勧めします。このシリーズの第2部では、アドインによるOutlookの拡張について解説するのでご期待ください。アドインを利用すると、ユーザーの慣れ親しんだ環境で新しい機能を公開でき、ユーザーの生産性を高めることができます。Officeスイートを出発点にすればOffice関連アプリケーションをゼロから作らなくて済むため、短時間で高い価値を生み出すことができます。
謝辞
このシリーズに関して適切な助言をしてくれたMatt Goebelに感謝します。
MCPD、MCTS。Windowsソリューション専門の開発者。イリノイ州オークブルックのCrowe Chizekに所属。連絡先はrwireman@crowechizek.com。