<開発者向け> Microsoft Office Outlook 2007 の新機能 (2/2)

  

Randy Byrne, Program Manager
Microsoft Corporation

May 2006

適用対象:
   Microsoft Office Outlook 2007

要約: ここでは、Microsoft Office Outlook 2007 の開発者向け拡張機能と追加機能について説明します。この記事には、付属資料として What's New Add-In が用意されており、ダウンロード可能です。Outlook プラットフォームについての事前資料が必要な場合には、この記事とアドインで Outlook 2007 のコーディングを開始するにあたっての詳細情報を得ることができます。

Outlook2007WhatsNewAddin.msi をダウンロードする。

Outlook2007WhatsNewAddin.msi サンプル ファイルをダウンロードする。(サイズ未定)
Outlook2007WhatsNewAddin
MSDNSamples\Office2003

目次

Table オブジェクト
PropertyAccessor オブジェクト
AddressEntry 拡張機能
Rules オブジェクト
オブジェクトの共有
ショートカットメニュー
まとめ
その他の参考資料

Table オブジェクト

開発者から頻繁に挙げられる要望の 1 つに、Microsoft Office Outlook オブジェクト モデルを使用したときのパフォーマンスの向上があります。Microsoft Office Outlook 2007 では、Table と関連のオブジェクトでこの要望に対応しています。Table オブジェクトによって、フォルダ内のアイテムを列挙できます。また、プロパティを列として指定し、アイテムをテーブル内の行として並べ替えることができます。Outlook アイテムのオブジェクト ItemProperties が、アイテムの明示的な組み込みプロパティとカスタム プロパティを含んでいるのとは異なり、Table の各行は、既定で、そのアイテムの一連のプロパティを表します。このため、新しい Table オブジェクトは、従来の Items コレクションに比べて大幅にパフォーマンスが向上しています。1,000 アイテムを超えるような大きなコレクションについて、Table は、Items コレクション オブジェクトの列挙にかかる時間の約 10 ~ 20% 程度しか必要とせず、Items.SetColumns も使用しません。Items コレクションと異なり、開発者は効率良くコードを記述できます。また、アイテムの Body プロパティや Attachments コレクションを取得するためにパフォーマンスが大幅に低下するなどの Items コレクションの不利な点も備えていません。

既定の列セット

Table は、ほとんどの開発者が使い慣れているデータ アクセス モデルに基づいた Columns コレクションをサポートしています。既定の Columns コレクションは、Table の親 Folder オブジェクトに含まれている、予定アイテム、連絡先アイテム、メール アイテムなどのアイテムのタイプによって変わります。各種フォルダ タイプの既定の列を表 3 に示します。列は、Table のコード サンプルのように削除したり追加したりできます。

表 3 には、受信トレイ アイテム、送信トレイ アイテム、削除済みアイテムなど、すべての Outlook フォルダに対して生成される Table の既定の列を示します。

表 3. 全 Outlook フォルダのテーブルに対する既定の列

プロパティ
1 EntryID
2 Subject
3 CreationTime
4 LastModificationTime
5 MessageClass

表 4 は、予定表フォルダに対して生成される Table の既定の列を示しています。

表 4. 予定表フォルダのテーブルに対する既定の列

プロパティ
1 EntryID
2 Subject
3 CreationTime
4 LastModificationTime
5 MessageClass
6 Start
7 End
8 IsRecurring

表 5 は、連絡先フォルダに対して生成される Table の既定の列を示しています。

表 5. 連絡先フォルダのテーブルに対する既定の列

プロパティ
1 EntryID
2 Subject
3 CreationTime
4 LastModificationTime
5 MessageClass
6 FirstName
7 LastName
8 CompanyName

表 6 は、仕事フォルダに対して生成される Table の既定の列を示しています。

表 6. 仕事フォルダのテーブルに対する既定の列

プロパティ
1 EntryID
2 Subject
3 CreationTime
4 LastModificationTime
5 MessageClass
6 DueDate
7 PercentComplete
8 IsRecurring

列は、Column のインデックスを指定することで、行内に指定できます。インデックスには、Column の名前を表す文字列か、基底が 1 の整数値のいずれかを指定できます。

Table のコード サンプル

次のサンプルは、この記事に付属する What's New Add-In で使用できます。最初に Microsoft Visual C# のサンプルを示し、次に Microsoft Visual Basic .NET のサンプルを示します。DemoTable プロシージャでは、Table オブジェクトを使用して、TableDialog フォームの ListView コントロールを実装しています。また、このサンプル コードでは、受信トレイに語句マッチングの検索を実行して、部分的なアイテムの集合を表示できます。たとえば、図 5 の TableDialog フォームは、受信トレイ内の「Dev」と「Con」という単語を含むすべてのアイテムを表示しています。

Use the Table object to build a user interface that contains Instant Search results

図 5. Table オブジェクトを使用した、簡易検索の結果を表示するユーザー インターフェイスの作成

Folder.GetTable を呼び出して、Table インスタンスを作成したら、Table.GetNextRow メソッドを呼び出して Row オブジェクトの戻り値を取得します。これを、前方のみの移動で Table 全体に繰り返します。Table.IsEndOfTable が True を返したら、Table 内にあるすべての行にフェッチを行ったことになります。DemoTable プロシージャによって、Table から返される行を制限するフィルタを指定できます。フィルタには、有効な JET クエリ文字列、または DAV Searching and Locating (DASL) クエリ文字列を指定できます。フィルタの文字列が空の文字列の場合、フォルダ内のすべての行が返されます。Outlook フィルタ文字列の説明については、以下の「テーブルのフィルタ処理」の項を参照してください。

C# のコード サンプル
string AddQuotes(string queryString)
    {
        StringBuilder sb = new StringBuilder();
        sb.Append("\"");
        sb.Append(queryString);
        sb.Append("\"");
        return sb.ToString();
    }
void DemoTable(string filter)
    {
        try
        {
            Outlook.Table tbl = m_olApp.Session.GetDefaultFolder
                (Outlook.OlDefaultFolders.olFolderInbox).GetTable
                (filter, Outlook.OlTableContents.olUserItems);
            //既定の列セットを削除します
            tbl.Columns.RemoveAll();
            //列をテーブルに追加します
            tbl.Columns.Add("SenderName");
            tbl.Columns.Add("Subject");
            tbl.Columns.Add("ReceivedTime");
            tbl.Columns.Add("EntryID");
            tbl.Columns.Add("MessageClass");
            tbl.Columns.Add("Unread");
            //ReceivedTime を降順で並べ替えます
            tbl.Sort("ReceivedTime", true);
            //Table の各行に対して繰り返します
            while (!tbl.EndOfTable)
                {
                    Outlook.Row nextRow = tbl.GetNextRow();
                    DateTime receivedTime = (DateTime)
                        nextRow["ReceivedTime"];
                    //ListViewItem にプロパティを設定します
                    ListViewItem itm = new ListViewItem();
                    itm.Text = (string)nextRow["SenderName"];
                    itm.Tag = nextRow["EntryID"];
                    itm.SubItems.Add((string)nextRow["Subject"]);
                    //DateTime の形式を指定します
                    itm.SubItems.Add(
                        receivedTime.ToString(@"ddd M/dd/yyyy hh:mm tt"));
                    string msgClass = (string)nextRow["MessageClass"];
                    itm.SubItems.Add(msgClass);
                    //MessageClass でイメージ キーを決定します
                    if (msgClass.Startswith("IPM.Note.Rules.OofTemplate"))
                    {
                        itm.ImageKey = "mail_oof";
                    }
                    else if (msgClass.Equals("IPM.Note"))
                    {
                        if ((bool)nextRow["UnRead"] == true)
                        {
                            itm.ImageKey = "MailUnread";
                        }
                        else
                        {
                            itm.ImageKey = "MailRead";
                        }
                    }
                    else if (msgClass.Equals(
                        "IPM.Schedule.Meeting.Resp.Pos"))
                    {
                        itm.ImageKey = "meeting-response-accept";
                    }
                    else if (msgClass.Equals(
                        "IPM.Schedule.Meeting.Resp.Neg"))
                    {
                        itm.ImageKey = "meeting-response-decline";
                    }
                    else if (msgClass.Equals(
                        "IPM.Schedule.Meeting.Resp.Tent"))
                    {
                        itm.ImageKey = "meeting-response-tentative";
                    }
                    else if (msgClass.Equals(
                        "IPM.Schedule.Meeting.Request"))
                    {
                        itm.ImageKey = "meeting-request";
                    }
                    else if (msgClass.Equals(
                        "IPM.Schedule.Meeting.Canceled"))
                    {
                        itm.ImageKey = "meeting-cancel";
                    }
                    //Add the ListViewItem to ListView
                    ListView1.Items.Add(itm);
                }
        }
        catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
            }
    }   


Visual Basic .NET のコード サンプル
Function AddQuotes(ByVal queryString As String) As String
    Dim sb As New StringBuilder
    sb.Append(Chr(34))
    sb.Append(queryString)
    sb.Append(Chr(34))
    Return sb.ToString
End Function

Sub DemoTable(ByVal filter As String)
    Try
        Dim tbl As Outlook.Table = m_olApp.Session.GetDefaultFolder _
        (Outlook.OlDefaultFolders.olFolderInbox).GetTable _
        (filter, Outlook.OlTableContents.olUserItems)
        '既定の列セットを削除します
        tbl.Columns.RemoveAll()
        '列をテーブルに追加します
        tbl.Columns.Add("SenderName")
        tbl.Columns.Add("Subject")
        tbl.Columns.Add("ReceivedTime")
        tbl.Columns.Add("EntryID")
        tbl.Columns.Add("MessageClass")
        tbl.Columns.Add("Unread")
        'ReceivedTime を降順で並べ替えます
        tbl.Sort("ReceivedTime", True)
        'Iterate the Table Rows
        Do Until tbl.EndOfTable
            'GetNextRow を呼び出します
            Dim nextRow As Outlook.Row = tbl.GetNextRow()
            Dim receivedTime As DateTime = _
            CType(nextRow("ReceivedTime"), Date)
            'ListViewItem にプロパティを設定します
            Dim itm As New ListViewItem
            itm.Text = nextRow("SenderName").ToString
            itm.Tag = nextRow("EntryID").ToString
            itm.SubItems.Add(nextRow("Subject").ToString)
            'DateTime の形式を指定します
            itm.SubItems.Add _
            (receivedTime.ToString("ddd M/dd/yyyy hh:mm tt"))
            Dim msgClass As String = nextRow("MessageClass").ToString
            itm.SubItems.Add(msgClass)
            'MessageClass でイメージ キーを決定します
            If msgClass.StartsWith("IPM.Note.Rules.OofTemplate") Then
                itm.ImageKey = "mail_oof"
            ElseIf msgClass.Equals("IPM.Note") Then
                If CType(nextRow("UnRead"), Boolean) Then
                    itm.ImageKey = "MailUnread"
                Else
                    itm.ImageKey = "MailRead"
                End If
            ElseIf msgClass.Equals("IPM.Schedule.Meeting.Resp.Pos") Then
                itm.ImageKey = "meeting-response-accept"
            ElseIf msgClass.Equals("IPM.Schedule.Meeting.Resp.Neg") Then
                itm.ImageKey = "meeting-response-decline"
            ElseIf msgClass.Equals("IPM.Schedule.Meeting.Resp.Tent") Then
                itm.ImageKey = "meeting-response-tentative"
            ElseIf msgClass.Equals("IPM.Schedule.Meeting.Request") Then
                itm.ImageKey = "meeting-request"
            ElseIf msgClass.Equals("IPM.Schedule.Meeting.Canceled") Then
                itm.ImageKey = "meeting-cancel"
            End If
            'ListViewItem を ListView に追加します
            ListView1.Items.Add(itm)
        Loop
    Catch ex As Exception
        Debug.Print(ex.Message)
    End Try
End Sub

テーブルのフィルタ処理

Table のフィルタ処理のすべての機能について説明するのは、この記事の説明範囲を超えます。詳細については、『Outlook Developer Reference』(英語) を参照してください。開発者にとっての重要事項は、Outlook 2007 に組み込まれた簡易検索機能を利用できることです。簡易検索は、フィルタ文字列の ci_startswith または ci_phrasematch キーワードで実行できます。簡易検索のキーワードを使用するには、DASL フィルタを作成する必要があります。DASL フィルタの作成方法に関する説明の前に、Table でサポートされている 2 種類のフィルタ文字列を説明する必要があります。Table は、JET と DASL の構文で作成されたフィルタ文字列をサポートしています。それぞれの頭字語には、次の意味があります。

  • DASL : DAV Searching and Locating クエリ文字列。特に、この記事で説明している DASL は、Outlook における DASL の Microsoft Exchange 実装に基づいています。
  • JET : JET クエリの構文は、Access の Expression Service に基づいています。JET は、Visual Basic? に似た言語で、Items コレクションの Restrict メソッドまたは Table オブジェクトのフィルタ文字列を作成するために使用します。

表 7 は、Outlook 2007 オブジェクト モデルのフィルタ文字列のエントリ ポイントを一覧表示しています。

表 7. Outlook 2007 でのフィルタ文字列のエントリ ポイント

エントリ ポイント 説明
Application.AdvancedSearch @SQL= のプレフィックスがない DASL クエリのみ使用可能です。
View.Filter @SQL= のプレフィックスがない DASL クエリのみ使用可能です。
Folder.GetTable, Table.FindRow, Table.Restrict DASL と JET クエリを使用可能です。DASL クエリにはプレフィックス @SQL= を使用する必要があります。
Items.Find, Items.Restrict DASL と JET クエリを使用可能です。Outlook 2007 では、新たに Items.Restrict に対して DASL クエリを使用できるようになりました。DASL クエリにはプレフィックス @SQL= を使用する必要があります。

以下に、DASL 制限用の (CI_ のプレフィックスが付けられた) コンテンツ インデックス文字列比較キーワードを示します。ItemsTable オブジェクトについては、Items.Restrict および Table.Restrict のフィルタでコンテンツ インデックスを使用できます。ただし、Items.Find およびTable.FindRow のフィルタにはコンテンツ インデックスのキーワードは使用できません。同じフィルタ文字列に、DASL の比較と JET の比較を混在させることはできません。

CI_STARTSWITH

CI_STARTSWITH は、プレフィックス マッチングの検索を実行します。CI_STARTSWITH は、比較文字列の文字、単語または複数の単語を使用して、インデックスが指定された任意のプロパティに含まれる任意の単語について、先頭から数文字の一致を検出します。

  • 比較文字列内の文字や単語は、先頭から一致する文字や単語にする必要があります。
  • 比較では大文字と小文字が区別されます。
  • RE: および FW: のアイテムの件名に付けられたプレフィックスは、マッチングで無視されます。件名がRE: で始まるアイテムを特定する必要がある場合は、比較で「'RE:'」を使用してください。
  • 件名やメッセージ本文の複数の単語を含むフィールド内のあらゆる単語との一致を検出できます。これらのフィールドでは、単語が最初の単語でなくてもかまいません。
CI_PHRASEMATCH

CI_PHRASEMATCH は、語句マッチングの検索を実行します。CI_PHRASEMATCH は、比較文字列の文字、単語または複数の単語を使用して、インデックスが指定された任意のプロパティに含まれる任意の単語について、単語全体の一致を検出します。

  • 比較文字列の文字や単語は、完全に一致するものを指定する必要があります。サブストリング マッチングまたはプレフィックス マッチング (件名の RE:FW: など) は実行されません。
  • 比較では大文字と小文字が区別されます。
  • 語句マッチングでは、RE:FW: の件名のプレフィックスは無視されます。
  • 件名やメッセージ本文の複数の単語を含むフィールド内のあらゆる単語との一致を検出できます。これらのフィールドでは、単語が最初の単語でなくてもかまいません。
Microsoft Windows デスクトップ サーチに依存する CI_ キーワード

CI_STARTSWITHCI_PHRASEMATCH は、簡易検索の結果を返すのに Windows デスクトップ サーチ コンポーネントを使用します。Windows デスクトップ サーチ コンポーネントがインストールされていない場合に、CI_ キーワードを使用して Table を制限しようとすると、エラーが返されます。Windows デスクトップ サーチ コンポーネントは、Microsoft Windows Vista の必須コンポーネントです。Microsoft Windows XP SP2 と Microsoft Windows Server 2003 の場合、独立したコンポーネントとしてインストールする必要があります。簡易検索が、特定の Store オブジェクトに対して有効かどうかを確認するには、Store オブジェクトの IsInstantSearchEnabled プロパティを使用する必要があります。記述するコードでは、Folder.Store.IsInstantSearchEnabled が False を返す場合も処理する必要があります。この場合は、CI_ キーワードを使用せず、代わりにサブストリング マッチングや、等価マッチングを使用する必要があります。

LIKE

LIKE は、サブストリング マッチングを実行します。LIKE キーワードを使用する場合、クエリには簡易検索コンポーネントが使用されず、CI_STARTSWITHCI_PHRASEMATCH を使用した制限よりも処理が遅くなります。LIKE は、比較文字列の文字や単語を使用して、サブストリングの一致を検出します。一致を検出する比較文字列内の単語または文字は、% 記号で囲む必要があります。検索するフォルダが、インデックスの指定されていないストアに含まれている場合は、サブストリング マッチングが全テキストの比較に使用されます。

  • 比較文字列内の文字や単語には、単語内やプロパティ内の任意の位置にある文字または単語を指定できます。
  • 比較では大文字と小文字が区別されます。
  • 比較文字列の文字や単語は、% 記号で囲みます。
  • 件名やメッセージ本文など、複数の単語を含むフィールド内のあらゆる単語との一致を検出できます。単語は最初の単語でなくてもかまいません
  • LIKE の比較では、簡易検索エンジンが使用されません。LIKE を使用したサブストリング マッチングは、CI_STARTSWITHCI_PHRASEMATCH よりも低速になります。
=

= は、等価マッチングを実行します。= キーワードを使用する場合、クエリにはコンテンツ インデックス検索が使用されないため、通常の検索よりも処理が遅くなります。= は、比較文字列の文字や単語を使用して、完全一致を検出します。

  • 比較文字列内の文字や単語は、検索する単語またはプロパティと同一のものを指定する必要があります。
  • 比較では大文字と小文字が区別されます。
  • DASL クエリの等価マッチングでは、RE:FW: の件名のプレフィックスは無視されます。DASL クエリは、MAPI の PR_NORMALIZED_SUBJECT プロパティではなく、PR_SUBJECT プロパティに対して処理されます。等価比較用の等価フィルタを作成する必要がある場合は、比較文字列に件名のプレフィックスを含める必要があります。
  • = の比較では、簡易検索エンジンが使用されません。= を使用した等価マッチングは、CI_STARTSWITHCI_PHRASEMATCH よりも低速になります。

検索するフォルダに、以下の件名のアイテムが含まれているとします。

Question
Questionable
Unquestionable
RE: Question
FW: Question
The big question

次の CI_STARTSWITH 制限は、下の一覧の結果を返します。

string filter = "@SQL="
                + AddQuotes("urn:schemas:httpmail:subject")
                + " ci_startswith 'question'";

Question
Questionable
RE: Question
FW : Question
The big question

次の CI_PHRASEMATCH 制限は、下の一覧の結果を返します。

string filter = "@SQL="
                + AddQuotes("urn:schemas:httpmail:subject")
                + " ci_phrasematch 'question'";

Question
RE: Question
FW : Question
The big question

次の like 制限は、下の一覧の結果を返します。

string filter = "@SQL="
                + AddQuotes("urn:schemas:httpmail:subject")
                + " like '%question%'";

Question
Questionable
Unquestionable
RE: Question
FW: Question
The big question

次の = 制限は、下の一覧の結果を返します。

string filter = "@SQL="
                + AddQuotes("urn:schemas:httpmail:subject")
                + " = 'question'";

Question

その他の Table に関するヒント

Table オブジェクトの操作における効率を向上できるように、以下に Table に関するヒントの一覧を示します。

  • Table.Restrict を使用して、TableRows に対する制限を実行します。制限文字列には、DASL または JET 文字列のいずれかを使用できます。ただし、同じクエリ文字列に DASL と JET を混在させることはできません。
  • Columns.Add を使用して、既定の Columns 以外の列を追加します。列は、明示的な組み込みのプロパティ名 (Importance) か、「PropertyAccessor オブジェクト」の項で説明するように、対応する名前空間を参照する名前を使用して追加できます。必要に応じて Table から Columns を削除することもできます。Column を追加したら、Row[<インデックス>] を呼び出して RowColumn を戻り値として取得するときに、同じ Column.Name でその列を指定します。インデックスには、Column の名前 (ColumnName プロパティに指定されています) か、基底が 1 の整数値のいずれかを指定できます。
  • DownloadStateBodyFormat など、特定の計算が行われるプロパティは、Table に追加できません。ストア プロバイダによっては、Column として追加した文字列プロパティについて、先頭から 255 文字しか返さないものがあります。文字列全体が必要な場合は、Table から返される EntryID を使用して、NameSpace.GetItemFromID を呼び出すことで、アイテム全体を開きます。PropertyAccessor オブジェクトは、Outlook オブジェクト モデルで公開されていないプロパティの全文字列へのアクセスをサポートしています。
  • Row.GetValues を使用して、特定の行の値をすべて含む戻り値の 1 次元配列を取得します。Table.GetArray を使用して、指定した行数のすべて値を含む戻り値の 2 次元配列を取得します。
  • Table.Sort を使用して、Table の行を並べ替えます。並べ替えができるのは、Subject などの明示的な組み込みプロパティ名のみです。名前空間を参照する名前によって並べ替える必要がある場合には、Table.GetValues を使用して戻り値の配列を取得し、その配列を並べ替えます。
  • 特定の Column に返される値が DateTime 値の場合、Column の指定に明示的な組み込みプロパティ名を使用したか、名前空間を参照する名前を使用したかによって値が変化します。LastModificationTime など、明示的な組み込みプロパティ名を使用して指定された列の場合、行 (列) の値はローカル タイムで返されます。DAV:getlastmodified など、名前空間を参照する名前を使用して指定された列の場合、行 (列) の値は世界協定時 (UTC) で返されます。Row.LocalTimeToUTC および Row.UTCToLocalTime を使用して、変換を実行します。
  • 特定の列に返される値がバイナリ (PT_BINARY) 値の場合、Column の指定に組み込みプロパティ名を使用したか、スキーマ名を使用したかによって値が変化します。EntryID などの明示的な組み込みプロパティ名の場合、行 (列) の値は文字列で返されます。PT_BINARY プロパティの名前空間を参照するプロパティ名の場合、行 (列) の値はバイト配列で返されます。Row.BinaryToString を使用して、バイト配列を文字列に変換します。
  • Folder.GetTable を呼び出し、TableContents 引数を OlTableContents.olHiddenItems に設定します。Table から返される Rows は、フォルダ内の非表示のアイテムを表します。非表示のアイテムは、表示されるユーザー アイテムへの制限と同様に制限できます。表示のアイテムは、通常、カスタム アドインの設定を保存するためや、古いアイテムの整理の設定など、Outlook の設定を保存するために使用します。また、Folder.GetStorag を使用して、自身の StorageItem を作成または取得します。StorageItem は、非表示で、ローミングを実行し、オンラインとオフラインで利用可能なアドインの設定用に設計されています。

PropertyAccessor オブジェクト

PropertyAccessor オブジェクトも、Table オブジェクトと同様に、Outlook オブジェクト モデルによって実現できる機能についての重要変更です。PropertyAccessor は、Outlook オブジェクト プロパティへのアクセスを可能にします。これは、Outlook オブジェクト モデルには存在しない機能です。Microsoft Collaboration Data Objects (CDO) 1.21 に詳しい方は、CDO の Fields および Field オブジェクトに置き換わるものと考えてください。CDO と違い、PropertyAccessor は、整数のタグ値の代わりに可読文字列の値を使用して、Outlook オブジェクトの組み込みプロパティとカスタム プロパティの両方にアクセスします。以下のオブジェクトは、PropertyAccessor をサポートしています。

  • AddressEntry
  • AddressList
  • AppointmentItem
  • Attachment
  • ContactItem
  • DistListItem
  • DocumentItem
  • ExchangeDistributionList
  • ExchangeUser
  • Folder
  • JournalItem
  • MailItem
  • MeetingItem
  • NoteItem
  • PostItem
  • Recipient
  • RemoteItem
  • ReportItem
  • SharingItem
  • Store
  • TaskItem
  • TaskRequestAcceptItem
  • TaskRequestDeclineItem
  • TaskRequestItem
  • TaskRequestUpdateItem

PropertyAccessor のサンプル コード

PropertyAccessor オブジェクトを使用する例について説明します。簡易メール転送プロトコル (SMTP) でメッセージが配信されるとき、メッセージにトランスポート ヘッダーがスタンプされます。そのヘッダーには、メッセージを送信先へ配信するためのルーティングに関する情報が含まれています。Outlook の以前のバージョンでは、開発者がこのプロパティを読むには、CDO、Extended MAPI、またはサードパーティ ライブラリを使用する必要がありました。Outlook 2007 では、PropertyAccessor オブジェクトを使用して、トランスポート ヘッダー (PR_TRANSPORT_MESSAGE_HEADERS) の値を読み取ることができます。以下のコードは、トランスポート ヘッダー プロパティが Null ではないメッセージで Table を制限する方法、NameSpace.GetItemFromID を使用して TableRow を開く方法、および PropertyAccessor オブジェクトの GetProperty メソッドを使用して、メッセージ ボックスのトランスポート ヘッダーを表示する方法を示しています。

C# のサンプル コード
void DemoPropertyAccessorGetProperty()
    {
        string EntryID = "";
        //PR_TRANSPORT_MESSAGE_HEADERS の SchemaName
        string SchemaTransportHeader =
            @"https://schemas.microsoft.com/mapi/proptag/0x007D001E";
        string filter = "@SQL=" + "Not(" 
            + "\"" + SchemaTransportHeader + "\"" + " Is Null)";
        Outlook.Table tbl = m_olApp.Session.GetDefaultFolder(
            Outlook.OlDefaultFolders.olFolderInbox).GetTable(
            filter, Outlook.OlTableContents.olUserItems);
        if (tbl.GetRowCount() > 0)
        {
            Outlook.Row oRow = tbl.GetNextRow();
            EntryID = oRow["EntryID"].ToString();
        }
        else
        {
            MessageBox.Show("No messages found with Transport Header.", 
                "Demo", MessageBoxButtons.OK, MessageBoxIcon.Information);
            return;
        }
        //GetItemFromID を使用して MailItem を取得します
        Outlook.MailItem oMail =
            (Outlook.MailItem)
            m_olApp.Session.GetItemFromID(EntryID, Type.Missing );
        //PropertyAccessor クラスのインスタンスを取得します
        Outlook.PropertyAccessor oPA = oMail.PropertyAccessor;
        string Transport = (string)oPA.GetProperty(SchemaTransportHeader);
        //GetProperty を呼び出します
        MessageBox.Show(this, Transport,
            "Transport Header: " + oMail.Subject);
    }

Visual Basic .NET のサンプル コード
Sub DemoPropertyAccessorGetProperty()
    Dim EntryID As String = ""
    'PR_TRANSPORT_MESSAGE_HEADERS の SchemaName
    Dim SchemaTransportHeader As String = _
    "https://schemas.microsoft.com/mapi/proptag/0x007D001E"
    Dim filter As String = "@SQL=" & "Not(" & Chr(34) _
    & SchemaTransportHeader & Chr(34) & " Is Null)"
    Dim tbl As Outlook.Table = m_olApp.Session.GetDefaultFolder( _
        Outlook.OlDefaultFolders.olFolderInbox).GetTable( _
    filter, Outlook.OlTableContents.olUserItems)
    If tbl.GetRowCount > 0 Then
        Dim oRow As Outlook.Row = tbl.GetNextRow()
        EntryID = oRow("EntryID").ToString()
    Else
        MessageBox.Show("No messages found with Transport Header.", _
           "Demo", MessageBoxButtons.OK, MessageBoxIcon.Information)
        Exit Sub
    End If
    'GetItemFromID を使用して MailItem を取得します
    Dim oMail As Outlook.MailItem = _
        CType(m_olApp.Session.GetItemFromID(EntryID), Outlook.MailItem)
    'Obtain an instance of PropertyAccessor class
    Dim oPA As Outlook.PropertyAccessor = oMail.PropertyAccessor
    Dim Transport As String = _
    CType(oPA.GetProperty(SchemaTransportHeader), String)
    'GetProperty を呼び出します
    MessageBox.Show(Me, Transport, _
        "Transport Header: " & oMail.Subject)
End Sub

**注:   **このコードの例で、PR_TRANSPORT_MESSAGE_HEADERS の値を Table から直接読み取っていないことに疑問を持たれるかもしれません。これは、Table から返される文字列の長さが、フォルダのストア プロバイダによって異なるためです。Exchange の場合、Table から返される文字列の長さが、255 バイトに制限されます。この制限の実質的な影響について考えます。Exchange ストア内のフォルダで、255 バイトを超える文字列が必要になった場合、制限に Table を使用し (この場合は、トランスポート ヘッダー プロパティが Null または空ではないすべてのアイテムに行を指定します)、次に、Namespace.GetItemFromID を使用してアイテム全体を取得します。アイテム全体を取得しているときには、PropertyAccessor.GetProperty の呼び出しでは、Table から返される途中で切れた値ではなく、文字列全体が返されます。

名前空間によってプロパティを参照する形式

PropertyAccessor は、SetProperty または GetProperty 呼び出しの文字列引数にいくつかの形式をサポートしています。ただし、これらのすべての形式についてこの記事に記載することはできないため、以下の一覧に、PropertyAccessor に対して有効な、サポートされているいくつかの形式についての簡単な説明を示します。詳細については、『Outlook Developer Reference』の「Referencing Properties by Namespace」(英語) のトピックを参照してください。プロパティ タグの形式

この形式は、MAPI proptag 名前空間に基づいています。この構文は次のようになります。

https://schemas.microsoft.com/mapi/proptag/0xHHHHHHHH

HHHHHHHH は、MAPI プロパティ タグ値の 16 進数表現を表しています。プロパティ タグ形式では、0xHHHHHHHH の値が &H8000 を超える場合、エラーが発生します。16 進タグの値が &H8000 を超えるプロパティには、「id 名前空間の名前付きプロパティ形式」で示されている形式を使用します。

例 :

id 名前空間の名前付きプロパティ形式

この名前付きプロパティの形式は、MAPI id 名前空間に基づいています。この構文は次のようになります。

https://schemas.microsoft.com/mapi/id/{HHHHHHHH-HHHH-HHHH-HHHH-HHHHHHHHHHHH}/HHHHHHHH

{HHHHHHHH-HHHH-HHHH-HHHH-HHHHHHHHHHHH} は、名前空間の GUID を表し、HHHHHHHH は、ID 値の 16 進表現を表します。PropertyAccessor メソッドは、内部で GetIDsFromNames を実行し、正しいプロパティ値が設定または返されていることを確認します。

例 :

文字列名前空間の名前付きプロパティ形式

この名前付きプロパティの形式は、MAPI 文字列名前空間に基づいています。この構文は次のようになります。

https://schemas.microsoft.com/mapi/string/{HHHHHHHH-HHHH-HHHH-HHHH-HHHHHHHHHHHH}/name

{HHHHHHHH-HHHH-HHHH-HHHH-HHHHHHHHHHHH} は、名前空間の GUID を表し、name は、プロパティの文字列名を表します。PropertyAccessor メソッドは、内部で GetIDsFromNames を実行し、正しいプロパティ値が設定または返されていることを確認します。

例 :

Office 形式

Microsoft Office 形式は、文字列名前空間の名前付き形式の変形です。Office 形式は、組み込みの Outlook プロパティを参照するのにも使用できます。以下のスキーマ名は、両方がアイテムのカテゴリを返します。

PropertyAccessor の使用方法のガイドライン

PropertyAccessor は、強力なオブジェクトですが、その使用方法には多少の説明が必要です。以下の一覧は、PropertyAccessor の用途に関する一般的なガイドラインを示しています。詳細については、『Outlook Developer Reference』の「Best Practices for Getting and Setting Properties」(英語) のトピックを参照してください。

  • PropertyAccessor は、MailItem.SubjectAppointmentItem.Start などのオブジェクト モデル プロパティに置き換わるものではありません。明示的な組み込みプロパティには、オブジェクト モデルの適切なメンバを引き続き使用する必要があります。UserProperties.Add で追加したカスタム プロパティや、カスタム フォームに定義したカスタム プロパティについては、引き続き UserProperties(CustomPropertyName) を使用してカスタム プロパティの設定または取得を行います。
  • 特定のプロパティが、オブジェクトで公開されていない場合は、PropertyAccessor を使用して、プロパティの読み取りや設定を行います。プロパティの設定が可能かどうかは、ストア プロバイダによって異なります。たとえば、一部のストア プロバイダでは、Folder オブジェクトにプロパティを設定できません。
  • 明示的に Save を呼び出す必要があるオブジェクトでは (MailItemContactItem など)、PropertyAccessor を使用して設定したプロパティを保存するために Save を呼び出す必要があります。
  • 複数のプロパティを設定または取得する必要がある場合は、ネットワーク トラフィックの削減と、パフォーマンスの向上のために、PropertyAccessor.GetProperties および PropertyAccessor.SetProperties を使用してください。
  • PropertyAccessor は、Outlook アイテムにカスタム プロパティを作成するために使用できます。カスタム プロパティは、フィールドの選択でユーザーに表示されることはありません。また、カスタム フォームのコントロールに自動的にバインドされません。プロパティが存在しない場合には、SetProperty または SetProperties を呼び出すことで、特定の 1 つまたは複数のプロパティを作成できます。
  • PropertyAccessor は、常に、日付/時刻値を UTC 時刻で返します。UTC の DateTime 値をローカル タイムに変換する必要がある場合は、PropertyAccessor.UTCToLocalTime ヘルパー メソッドを使用します。
  • PropertyAccessor は、常に、(エントリ ID に使用されている) PT_BINARY 値をバイト配列で返します。バイト配列を文字列に変換する必要がある場合は、PropertyAccessor.BinaryToString ヘルパー メソッドを使用します。

AddressEntry の拡張

統一化の目標に従って、Outlook 2007 オブジェクト モデルでは、プログラムからのアドレス帳の表示や、AddressEntry オブジェクトの詳細情報の返送がサポートされるようになり、この趣旨で CDO と同レベルの機能が実現されています。SelectNamesDialog オブジェクトは、Outlook の [アドレス帳] ダイアログ ボックスの表示や、ボタンの数、ボタンのキャプション、初期アドレス一覧などのオプションの設定を可能にします。

SelectNamesDialog オブジェクト

例として、ユーザーが [連絡先] フォルダの受賞者を選択するように [アドレス帳] ダイアログ ボックスを表示する必要があると仮定します。Outlook の以前のバージョンでこの機能を実現するには、CDO またはサードパーティ ライブラリを使用する必要がありました。Outlook 2007 では、SelectNamesDialog オブジェクトのインスタンスを取得することで [アドレス帳] を表示できます。SelectNamesDialog でサポートされる機能の概要を以下に示します。

  • ダイアログ ボックス キャプションの設定
  • 受賞者の選考者数の指定と、所定の選択者に対するキャプションの変更
  • ダイアログ ボックスでの初期アドレス一覧の設定と取得、およびダイアログ ボックス内で使用できるアドレス一覧を初期アドレス一覧だけにするかどうかの決定
  • ユーザーが複数の受賞者を選択できるようにするかどうかの指定
  • Outlook [アドレス帳] ダイアログ ボックスの表示
  • ユーザーがダイアログ ボックスで選択したすべての受賞者を表す Recipients コレクション オブジェクトの取得

SelectNamesDialog のコード サンプルは、(図 6 の) アドレス帳のダイアログ ボックスを表示します。このダイアログ ボックスで、ユーザーは、[連絡先] フォルダから "受賞者" (複数可) を選択できます。ユーザーが複数の連絡先を選択する場合、SelectNamesDialog.Recipients によって、選択された受賞者を列挙できます。また、メッセージをプログラムによって送信するなどの追加機能でそれらの受賞者を使用できます。

Customize the Outlook Address Book by using the SelectNamesDialog object

図 6. SelectNamesDialog オブジェクトによる Outlook アドレス帳のカスタマイズ

SelectNamesDialog と同じコードを Namespace.GetSelectNamesDialog メソッドに使用して、SelectNamesDialog オブジェクトのインスタンスを作成します。SelectNamesDialog.InitialAddressList を設定する前に、目的の AddressList を初期アドレス一覧として表示されるようにし、コードが AddressLists コレクション全体をループするようにし、さらに新しい AddressList.GetContactsFolder メソッドを使用して、AddressList が既定の連絡先フォルダになるようにします。正しい AddressList を取得し、InitialAddressList プロパティを設定したら、ダイアログ ボックスのキャプション、受賞者の選考者の人数、および選択用コマンド ボタンのキャプションを指定するプロパティを SelectNamesDialog オブジェクトに設定します。最後に、SelectNamesDialog.Recipients で、選択された受賞者を返します。

C# のサンプル コード
void DemoAddressEntryEnhancements()
    {
        Outlook.AddressList ContactsAddrList = null;
        Outlook.SelectNamesDialog oSND =
            m_olApp.Session.GetSelectNamesDialog();
        //最初に既定の連絡先フォルダを取得します
        string DefaultEntryID =
            m_olApp.Session.GetDefaultFolder(
            Outlook.OlDefaultFolders.olFolderContacts).EntryID;
        //AddressLists を列挙します
        Outlook.AddressLists oAddrLists = m_olApp.Session.AddressLists;
        foreach (Outlook.AddressList oAddrList in oAddrLists)
        {
            if (oAddrList.GetContactsFolder() != null)
            {
                //GetContactsFolder で Folder オブジェクトを返します。EntryID を比較します
                if (m_olApp.Session.CompareEntryIDs(
                    oAddrList.GetContactsFolder().EntryID , DefaultEntryID))
                {
                    //InitialAddressList を連絡先フォルダの AddressList に設定します
                    ContactsAddrList = oAddrList;
                    break;
                }
            }
            else
            {
                MessageBox.Show("Could not find Contacts Address Book",
                    "Lookup Error", MessageBoxButtons.OK,
                    MessageBoxIcon.Error);
                return;
            }
        }
        //SelectNamesDialog に追加のプロパティを設定します
        oSND.Caption = "Special Contest";
        oSND.InitialAddressList = ContactsAddrList;
        oSND.NumberOfRecipientSelectors =
            Outlook.OlRecipientSelectors.olShowTo;
        oSND.ToLabel="Award Winner(s)";
        //表示します
        oSND.Display();
        //選択された受賞者の名前を列挙します
        Outlook.Recipients oRecips = oSND.Recipients;
        if (oRecips.Count > 0)
        {
            StringBuilder sb = new StringBuilder();
            foreach(Outlook.Recipient oRecip in oRecips)
            {
                sb.AppendLine(oRecip.Name);
            }
            MessageBox.Show(this, sb.ToString(), "Selected Recipients");        
        }
    }

Visual Basic .NET のサンプル コード
Sub DemoAddressEntryEnhancements()
    Dim ContactsAddrList As Outlook.AddressList = Nothing
    Dim oSND As Outlook.SelectNamesDialog = _
        m_olApp.Session.GetSelectNamesDialog
    '最初に既定の連絡先フォルダを取得します
    Dim DefaultEntryID As String = _
        m_olApp.Session.GetDefaultFolder _
        (Outlook.OlDefaultFolders.olFolderContacts).EntryID
    'AddressLists を列挙します
    Dim oAddrLists As Outlook.AddressLists = _
        m_olApp.Session.AddressLists
    For Each oAddrList As Outlook.AddressList In oAddrLists
        If Not (oAddrList.GetContactsFolder Is Nothing) Then
            'GetContactsFolder で Folder オブジェクトを返します。EntryID を比較します
            If m_olApp.Session.CompareEntryIDs _
                (oAddrList.GetContactsFolder.EntryID, DefaultEntryID) Then
                ContactsAddrList = oAddrList
                Exit For
            End If
        End If
    Next
    If Not (ContactsAddrList Is Nothing) Then
        'InitialAddressList を連絡先フォルダの AddressList に設定します
        oSND.InitialAddressList = ContactsAddrList
    Else
        MessageBox.Show("Could not find Contacts Address Book", _
        "Lookup Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Exit Sub
    End If
    'SelectNamesDialog に追加のプロパティを設定します
    oSND.Caption = "Special Contest"
    oSND.NumberOfRecipientSelectors = _
    Outlook.OlRecipientSelectors.olShowTo
    oSND.ToLabel = "Award Winner(s)"
    '表示します
    oSND.Display()
    '選択された受賞者の名前を列挙します
    Dim oRecips As Outlook.Recipients = oSND.Recipients
    If oRecips.Count > 0 Then
        Dim sb As New StringBuilder
        For Each oRecip As Outlook.Recipient In oRecips
            sb.AppendLine(oRecip.Name)
        Next
        MessageBox.Show(Me, sb.ToString, "Selected Recipients")
    End If
End Sub

ExchangeUser と ExchangeDistributionList オブジェクト

Outlook アドレス帳をプログラムから表示できるようになると、選択された受信者の追加情報を検索することが必要になります。受信者のアドレスが SMTP アドレスの場合、受信者の表示名と SMTP アドレスを検索しない限り、操作ができません。受信者が Exchange 受信者の場合は、Outlook 2007 オブジェクト モデルで、すべての操作をより簡単に実行できます。既存の AddressEntry オブジェクトから派生した、以下の 2 つの新しいオブジェクトを使用できます。

  • ExchangeUser
  • ExchangeDistributionList

これらのオブジェクトは、従来の AddressEntry オブジェクトから派生したものです。従来の AddressEntry オブジェクトと異なり、Exchange ユーザーまたは Exchange 配布リストを表す AddressEntry の詳細をすべてプログラムから操作できます。PrimarySMTPAddressLastNameFirstName など、これらのオブジェクトのプロパティを取得できます。また、ExchangeUser のマネージャを決定したり、特定の ExchangeUser へのすべての直接報告者を表す AddressEntries を取得したりできます。

以下のコード サンプルは、受信トレイ内で、送信者が Exchange AddressEntry (正確には AddressEntry.Type = 'EX') の最初のアイテムを取得する方法を示しています。このクエリを満たすアイテムを検出したら、PropertyAccessor によって送信者の ContactItem.EntryID を取得します。EntryID を NameSpace オブジェクトの新しい GetAddressEntryFromID メソッドに渡して、戻り値の一意の AddressEntry を取得します。AddressEntryAddressEntryUserType が、Exchange ユーザーであることを示している場合は、AddressEntry.GetExchangeUser を呼び出して、戻り値の ExchangeUser オブジェクトを取得します。ExchangeUser オブジェクトを取得したら、DepartmentBusinessTelephoneNumber、または JobTitle のプロパティを取得して、コード内で使用します。以下のコード サンプルでは、Exchange 送信者のこれらのプロパティがメッセージ ボックスに表示されます。

C# のサンプル コード
void DemoSenderDetails()
    {
        string SchemaSenderEntryID =
            @"https://schemas.microsoft.com/mapi/proptag/0x0C190102";
        //受信トレイの最初のアイテムを取得します
        Outlook.Items oItems = m_olApp.Session.GetDefaultFolder( 
            Outlook.OlDefaultFolders.olFolderInbox).Items;
        oItems.Sort("ReceivedTime",true);
        Outlook.MailItem oMail = (Outlook.MailItem)oItems.Find(
            "[MessageClass]='IPM.Note' And [SenderEmailType] = 'EX'");
        if (oMail != null)
        {
            string SenderEntryID =
                oMail.PropertyAccessor.BinaryToString(
                oMail.PropertyAccessor.GetProperty(SchemaSenderEntryID));
            Outlook.AddressEntry oSender =
                m_olApp.Session.GetAddressEntryFromID(SenderEntryID);
            //ここで送信者を表す AddressEntry を取得します
            if(oSender.AddressEntryUserType ==
                Outlook.OlAddressEntryUserType.olExchangeUserAddressEntry
                || oSender.AddressEntryUserType ==
                Outlook.OlAddressEntryUserType.
                olExchangeRemoteUserAddressEntry)
            {
                //送信者の詳細についての ExchangeUser オブジェクトを使用します
                Outlook.ExchangeUser oExchUser = 
                    oSender.GetExchangeUser();
                StringBuilder sb = new StringBuilder();
                sb.AppendLine(oExchUser.Name);
                sb.AppendLine(oExchUser.JobTitle);
                sb.AppendLine(oExchUser.Department);
                sb.AppendLine(oExchUser.BusinessTelephoneNumber);
                MessageBox.Show(this, sb.ToString(),
                    "Sender Details",MessageBoxButtons.OK, 
                    MessageBoxIcon.Information);
                return;
            }
        }
        MessageBox.Show(this, "Exchange sender not found.", 
            "Sender Details", MessageBoxButtons.OK, 
            MessageBoxIcon.Warning);
    }       
}

Visual Basic .NET のサンプル コード
Sub DemoSenderDetails()
    Const SchemaSenderEntryID As String = _
        "http:schemas.microsoft.com/mapi/proptag/0x0C190102"
    '受信トレイの最初のアイテムを取得します
    Dim oItems As Outlook.Items = m_olApp.Session.GetDefaultFolder _
        (Outlook.OlDefaultFolders.olFolderInbox).Items
    oItems.Sort("ReceivedTime", True)
    Dim oMail As Outlook.MailItem = CType(oItems.Find _
        ("[MessageClass]='IPM.Note' And [SenderEmailType] = 'EX'"), _
        Outlook.MailItem)
    If Not (oMail Is Nothing) Then
        Dim SenderEntryID As String = _
            oMail.PropertyAccessor.BinaryToString _
            (oMail.PropertyAccessor.GetProperty(SchemaSenderEntryID))
        Dim oSender As Outlook.AddressEntry = _
            m_olApp.Session.GetAddressEntryFromID(SenderEntryID)
        'ここで送信者を表す AddressEntry を取得します
        If oSender.AddressEntryUserType = _
            Outlook.OlAddressEntryUserType _
            .olExchangeUserAddressEntry Or _
            oSender.AddressEntryUserType = _
            Outlook.OlAddressEntryUserType _
            .olExchangeRemoteUserAddressEntry Then
            '送信者の詳細についての ExchangeUser オブジェクトを使用します
            Dim oExchUser As Outlook.ExchangeUser = _
            oSender.GetExchangeUser
            Dim sb As StringBuilder = New StringBuilder()
            sb.AppendLine(oExchUser.Name)
            sb.AppendLine(oExchUser.JobTitle)
            sb.AppendLine(oExchUser.Department)
            sb.AppendLine(oExchUser.BusinessTelephoneNumber)
            MessageBox.Show(Me, sb.ToString, "Sender Details", _
                MessageBoxButtons.OK, MessageBoxIcon.Information)
            Exit Sub
        End If
    End If
    MessageBox.Show(Me, "Exchange sender not found.", _
        "Sender Details", MessageBoxButtons.OK, _
        MessageBoxIcon.Warning)
End Sub

ルール オブジェクト

ルールは、Outlook の最も強力な機能の 1 つです。整理された状態を維持し、受信トレイへ送信されるメッセージに継続的に応答します。Outlook の以前のバージョンでは、開発者にルールを変更する手段はありませんでした。Outlook 2007 では、プログラムからルールを作成し、ルールを実行するかどうかを判定する条件や例外を決定し、さらに実行する操作を設定できます。通常のルールの操作には、フォルダへのアイテムの移動やコピー、アイテムへの 1 つまたは複数のカテゴリの設定、アイテムへの仕事としてのマークなどがあります。仕事としてマークされたアイテムは、[To Do バー] に表示されます。この操作は、Outlook 2007 の重要な新機能です。また、ルールを実行するかどうかを決定する、ルールの条件や例外を設定できます。一般的なルールの条件には、メッセージが特定の受信者との間で送信または受信するものかどうか、自分のアドレスがメッセージの宛先または CC の行にあるかどうか、メッセージの本文または件名に特定の単語が含まれているかどうか、アイテムが指定された RSS フィードから送信されたものかどうかなどがあります。

Rules オブジェクトは使用が簡単で、プログラムからソリューション用のルールを作成するために使用できます。以下に Outlook 2007 オブジェクト モデルの Rules オブジェクトについての簡単な説明を示します。

  • ログオン済みセッションで定義されたルールはすべて、Rules コレクション オブジェクトに格納されます。Rules コレクション オブジェクトは、NameSpace オブジェクトの DefaultStoreGetRules を呼び出して取得します。
  • Rules コレクション内のルールは列挙できます。Rules を列挙するときには、プログラムからルールを有効または無効にできます。
  • 新しい Rule を作成するには、Rules.Create を呼び出します。Create メソッドを呼び出すときには、RuleType 引数を指定する必要があります。ルールには、OlRuleType.olRuleReceive 型または OlRuleType.olRuleSend 型を指定できます。これらの列挙定数は、Outlook 自動仕訳ウィザードの送信ルールおよび受信ルールに相当します。
  • Rule オブジェクトのインスタンスを作成したら、プログラムから Rule.ActionsRule.Conditions、および Rule.Exceptions を有効にできます。これらのオブジェクトはそれぞれ、静的コレクション オブジェクトです。独自のルールの操作を RuleActions コレクション オブジェクトなどに追加することはできません。
  • 一部のルールの操作や条件は、有効と無効の設定しかできません。たとえば、olConditionOnlyToMe 型のルール条件は、有効と無効の設定のみが可能です。その他のルール条件には、追加のプロパティを設定する必要があります。以下のサンプル コードでは、コレクション オブジェクトに 1 人または複数人数の受信者を追加する必要があります。
  • ルールの操作、条件、例外の設定が完了したら、Rules.Save を呼び出して新たに作成した Rule を保存します。
  • また、Rule.Execute を呼び出して、プログラムからルールを実行できます。Rule.Execute を呼び出すためにルールを保存する必要はありません。

ルールのサンプル コード

以下のサンプル コードは、Rules オブジェクト モデルを実際に実行した例を示しています。この例では、メッセージを受信した後に起動するルールを作成します。ルールの条件では、"someone@example.com" から受信したメッセージかどうか、およびメッセージが自分のみに宛てられているかどうかを判定します。メッセージがルールの条件を満たすと、本日処理するものとしてマークされ、[To Do バー] に表示されます。

C# のサンプル コード
void DemoCreateMarkAsTaskRule()
    {
        //DefaultStore からルールを取得します。
        Outlook.Rules oRules = m_olApp.Session.DefaultStore.GetRules();
        //新しい受信ルールを作成します
        Outlook.Rule oRule =
            oRules.Create("MarkAsTaskRule", 
            Outlook.OlRuleType.olRuleReceive);
        //From と OnlyToMe 条件を有効にして、プロパティを設定します
        oRule.Conditions.From.Enabled = true;
        oRule.Conditions.From.Recipients.Add("someone@example.com");
        oRule.Conditions.From.Recipients.ResolveAll();
        oRule.Conditions.OnlyToMe.Enabled = true;
        //MarkAsTask アクションを有効にして、プロパティを設定します
        oRule.Actions.MarkAsTask.Enabled = true;
        oRule.Actions.MarkAsTask.FlagTo = "Follow up";
        oRule.Actions.MarkAsTask.MarkInterval =
            Outlook.OlMarkInterval.olMarkToday;
        //Rules コレクションを保存します
        oRules.Save(false);
    }

Visual Basic .NET のサンプル コード
Sub DemoCreateMarkAsTaskRule()
    'DefaultStore からルールを取得します。
    Dim oRules As Outlook.Rules = _
        m_olApp.Session.DefaultStore.GetRules
    '新規に受信ルールを作成します
    Dim oRule As Outlook.Rule = _
        oRules.Create("MarkAsTaskRule", Outlook.OlRuleType.olRuleReceive)
    'From と OnlyToMe 条件を有効にして、プロパティを設定します
    oRule.Conditions.From.Enabled = True
    oRule.Conditions.From.Recipients.Add("someone@example.com")
    oRule.Conditions.From.Recipients.ResolveAll()
    oRule.Conditions.OnlyToMe.Enabled = True
    'MarkAsTask アクションを有効にして、プロパティを設定します
    oRule.Actions.MarkAsTask.Enabled = True
    oRule.Actions.MarkAsTask.FlagTo = "Follow up"
    oRule.Actions.MarkAsTask.MarkInterval = _
        Outlook.OlMarkInterval.olMarkToday
    'Rules コレクションを保存します
    oRules.Save(ShowProgress:=False)
End Sub

オブジェクトの共有

Outlook 2007 では、以前のバージョンよりも他の人との情報の共有が容易になっています。共有のメカニズムには、Exchange のパブリック フォルダ、Microsoft Windows SharePoint Services サイトなどさまざまなものがあります。ここでは、この分野について詳しく説明しません。Office 2007 内の情報のエンタープライズ共有については、それだけで 1 つの記事 (または本) として説明するに値する内容です。ここでは、特に連絡先や予定表の個人情報の共有について説明します。これらの個人情報は、会社の同僚や、友達および家族と共有できます。ある特定のシナリオを想定し、プログラムで予定表の共有を実現する方法を示します。また、オブジェクトの共有が、Outlook 2007 オブジェクト モデルにおいてどのような重要な位置付けにあるかについて説明します。

以下に、ソリューションで使用できるいくつかの共有オブジェクトについて簡単に説明します。

  • SharingItem オブジェクト : プログラムから Exchange 環境の共有メッセージを送信するために使用します。
  • CalenderSharing オブジェクト : 予定の日付範囲を iCal 添付ファイルへエクスポートするために使用します。
  • NameSpace オブジェクトの OpenSharedFolder メソッド : WebCal URL、RSS URL、Windows SharePoint Services サイトの URL など、各種共有リソースを開くために使用します。
  • NameSpace オブジェクトの OpenSharedItem メソッド : Outlook .msg フォーマット、vCard フォーマット、または iCal フォーマットでアイテムを開くために使用します。

CalendarSharing サンプル コード

ユーザーから、外部の重要顧客との予定表の共有について頻繁に要望を受けているとします。ユーザーに定期的に Outlook のユーザー インターフェイスからペイロード予定表共有アイテムを作成してもらうこともできます。開発者であれば、Outlook 2007 の新しい共有オブジェクトを使用してこのシナリオを自動化することもできます。以下のコード サンプルは、CalendarSharing オブジェクトを使用して、1 週間分の完全な詳細情報を含む iCal ペイロード共有アイテムを作成します。アイテムは、someone@example.com に送信され、下書きフォルダに保存されます。

C# のサンプル コード
void DemoCalendarSharing()
    {
        //CalendarSharing オブジェクトのインスタンスを取得します
        Outlook.CalendarSharing oShare =
            m_olApp.Session.GetDefaultFolder
            (Outlook.OlDefaultFolders.olFolderCalendar)
            .GetCalendarExporter();
        //完全な詳細情報を指定します
        oShare.CalendarDetail = 
            Outlook.OlCalendarDetail.olFullDetails;
        //開始日と終了日を取得します
        DateTime StartDate = DateTime.Now;
        DateTime EndDate = StartDate.AddDays(7);
        oShare.StartDate = StartDate;
        oShare.EndDate = EndDate;
        //ForwardAsICal メソッドを呼び出します
        Outlook.MailItem oMail =
            oShare.ForwardAsICal(Outlook.OlCalendarMailFormat
            .olCalendarMailFormatDailySchedule);
        //受信者を追加します
        oMail.Recipients.Add("someone@example.com");
        oMail.Recipients.ResolveAll();
        //件名を設定します
        string CalName = m_olApp.Session.GetDefaultFolder
        (Outlook.OlDefaultFolders.olFolderCalendar).Name;
        oMail.Subject = m_olApp.Session.CurrentUser.Name +
            CalName.PadLeft(CalName.Length+1);
        //予定表共有アイテムを保存します
        oMail.Save();   
    }

Visual Basic .NET のサンプル コード
Sub DemoCalendarSharing()
    'CalendarSharing オブジェクトのインスタンスを取得します
    Dim oShare As Outlook.CalendarSharing = _
        m_olApp.Session.GetDefaultFolder _
        (Outlook.OlDefaultFolders.olFolderCalendar) _
        .GetCalendarExporter()
    '完全な詳細情報を指定します
    oShare.CalendarDetail = _
        Outlook.OlCalendarDetail.olFullDetails
    '開始日と終了日を取得します
    Dim StartDate As Date = DateTime.Now
    Dim EndDate As Date = StartDate.AddDays(7)
    oShare.StartDate = StartDate
    oShare.EndDate = EndDate
    'ForwardAsICal メソッドを呼び出します
    Dim oMail As Outlook.MailItem = _
        oShare.ForwardAsICal(Outlook.OlCalendarMailFormat _
        .olCalendarMailFormatDailySchedule)
    '受信者を追加します
    oMail.Recipients.Add("someone@example.com")
    oMail.Recipients.ResolveAll()
    '件名を設定します
    Dim CalName As String = m_olApp.Session.GetDefaultFolder _
        (Outlook.OlDefaultFolders.olFolderCalendar).Name
    oMail.Subject = m_olApp.Session.CurrentUser.Name _
        & CalName.PadLeft(CalName.Length + 1)
    '予定表共有アイテムを保存します
    oMail.Save()
End Sub

ショートカット メニュー

プログラミング可能なコンテキスト メニューは、Outlook の各バージョンで最も開発者の要望が多かった項目の 1 つです。Outlook 2007 では、以下のコンテキスト メニューをカスタマイズできます。

  • 添付ファイルのショートカット メニュー
  • アイテムのショートカット メニュー (特定のビューで表示されているアイテム)
  • フォルダ ショートカット メニュー (フォルダ ツリー内のフォルダ)
  • ショートカットのショートカット メニュー
  • ビューのショートカット メニュー

What's New Add-In には、ショートカット メニューのカスタマイズのひな形となる、サンプル コードが含まれています。Outlook は、ショートカット メニューの表示時にイベントを発行します。ItemContextMenuDisplay イベントは、ショートカット メニューのショートカット メニュー コントロールを表す CommandBar オブジェクトを渡します。イベント プロシージャでは、ショートカット メニューに新しいコマンドを追加したり、既存のコマンドを修正したりできます。これらすべての操作は、使い慣れた Office CommandBars オブジェクト モデルを使用して行うことができます。これらのコマンドは、Outlook に保存されません。イベントが発行されるたびに、コマンドバーの変更を実行する必要があります。

What's New Add-In によって、図 7 のように [Instant Search] コマンドがアイテムのショートカット メニューの一番下に表示されます。[Instant Search] は、ユーザーから Outlook の簡易検索機能を利用できるようにするポップアップ コマンド バー コントロールです。さらに、ユーザーは、特定の送信者からの先週送信されたメッセージ、今週送信されたメッセージ、先月送信されたメッセージ、今月送信されたメッセージ、またはすべてのメッセージを表示できるようになります。検索結果は、別のエクスプローラ ウィンドウに表示されます。

ショートカットメニューのカスタマイズのコードは、紙面の関係上、この記事には掲載しません。ただし、CommandBars オブジェクト モデルを使い慣れているのであれば、Outlook 2007 でのショートカット メニューのカスタマイズは容易です。

Add custom context menu items using new Application-level events

図 7. 新しいアプリケーションレベル イベントを使用したカスタム ショートカット メニュー項目の追加

まとめ

この記事は、Outlook 2007 の拡張性によって、どのような機能を実現できるかについての導入的な説明にすぎません。このバージョンは、今までの Outlook のリリースの中で、最もプログラミングの制御性が高いバージョンです。以前のバージョンで障害となっていた事項のほとんどが取り除かれています。Outlook 2007 では、フォーム領域、カスタム作業ウィンドウ、およびリボンを使用して、新しい多彩なソリューションを構築できます。What's New Add-Ins から始めることで、TablePropertyAccessor などの新しいオブジェクト モデルの機能を簡単に学ぶことができます。管理アドインを開発しているのであれば Microsoft Visual Studio デベロッパー センターで Microsoft Visual Studio Tools for the Microsoft Office System (Visual Studio Tools for Office) の新しいバージョンを確認してください。リボン、カスタム作業ウィドウなどの Office 2007 開発分野専門の設計者は、Visual Studio Tools for Office によって Outlook 2007 に対して最適な開発環境を構築できます。

オブジェクト モデルの使い方を学び、開発環境を選択したら、MSDN で用意されている Outlook 2007 の各種サンプル アドインをダウンロードしてください。これらのアドインは、ほぼすべての Outlook 2007 の拡張性を網羅しており、新しい TablePropertyAccessorFormRegionExchangeUserExchangeDistributionListSharingItem、および StorageItem オブジェクトのコードを含んでいます。リボン、カスタム作業ウィンドウ、およびフォーム領域をカスタマイズするための、IRibbonExtensibilityICustomTaskPaneConsumer、および FormRegionStartup を実装する方法について学ぶことができます。最終的には、Microsoft Office Outlook 2007 および 2007 Microsoft Office system の新しいプラットフォームのすばらしい機能を使用して、ソリューションを構築できるようになります。Outlook 2007 の開発環境は、活気にあふれ、効率が向上することを目指して整備されています。ユーザーへの創造性にあふれる、楽しくて新しいソリューションを構築してください。

その他の参考資料