Outlook 2010 の開発者のための新機能

概要: この記事では、Microsoft Outlook 2010 の開発者向けに強化および追加された機能の概要を示します。また、Outlook オブジェクト モデルの新しいオブジェクトや強化されたオブジェクトについても、それらのプロパティ、メソッド、およびイベントを含めて詳細に説明します。Outlook プラットフォームの習得に意欲的な開発者のために、この記事では Outlook 2010 に対するコーディングを始めるのに十分な詳細情報を提供します。

適用対象: Office 2010 | Outlook 2010

この記事の内容
Outlook 2010 プラットフォームの概要
Outlook オブジェクト モデルの変更点
アドインの弾力性
UI の拡張性の向上
包括的なオブジェクト モデル
32 ビットおよび 64 ビットのプラットフォームのサポート
複数の Exchange アカウント
まとめ
その他の技術情報

目次

  • Outlook 2010 プラットフォームの概要

  • Outlook オブジェクト モデルの変更点

  • アドインの弾力性

  • UI の拡張性の向上

  • 包括的なオブジェクト モデル

  • 32 ビットおよび 64 ビットのプラットフォームのサポート

  • 複数の Exchange アカウント

  • まとめ

  • その他の技術情報

Outlook 2010 プラットフォームの概要

Outlook 2010 オブジェクト モデルは、ユーザー インターフェイス (UI) を拡張したり、Outlook 2010 のエンド ユーザー向けに設計された新しい機能をオブジェクト モデルでサポートしたりしたいというお客様の要望を満たすように変更されています。Outlook 2010 プラットフォームには、次のような機能が備わっています。

  • アドインの弾力性

    アドインによって Outlook のパフォーマンスや弾力性が低下しないようにする必要があります。Outlook では、接続されたアドインの一覧が Windows イベント ログに書き込まれ、接続されたアドインごとの起動時間が記録されます。さらに、イベントのコールバック中にアドインがクラッシュしたときも Windows イベント ログに書き込まれます。ユーザー操作で Outlook アプリケーションが終了するときに、アドインが Outlook のパフォーマンスに悪影響を与えることがないように、Outlook では新しい高速シャットダウン プロセスが使用されます。新しいシャットダウン プロセスの詳細については、「Outlook 2010 でのシャットダウンの変更」を参照してください。

  • UI の拡張性の向上

    ナビゲーション ウィンドウのソリューション モジュールと呼ばれるカスタム ナビゲーション モジュールを含めて、Outlook UI のさまざまな新しい領域をカスタマイズできます。ソリューション モジュールにある Outlook フォルダー用のカスタム フォルダー アイコンを設定または取得できます。ソリューション モジュールを使用すると、カスタム ソリューション フォルダーのコンテンツを見つけやすくなります。Microsoft Office Fluent ユーザー インターフェイスの拡張性を使用することで、以前のバージョンの Outlook では拡張できなかった UI の領域をカスタマイズできるようになります。ソリューション モジュールの詳細については、「Outlook 2010 ソリューション モジュールのプログラミング」を参照してください。リボンの拡張性を使用して Outlook UI をカスタマイズする方法の詳細については、「Outlook 2010 のユーザー インターフェイスの拡張」を参照してください。

  • 32 ビットおよび 64 ビットのプラットフォームのサポート

    Outlook オブジェクト モデルという 1 つの API を使用して、32 ビットおよび 64 ビットのプラットフォーム用のソリューションを開発できます。

  • 包括的なオブジェクト モデル

    大多数の開発者にとって、このオブジェクト モデルは包括的で、Messaging API (MAPI) レベルでコードを記述することなく本格的なソリューションを作成するのに十分です。

  • 複数の Exchange アカウント

    1 つのプロファイルに複数の Microsoft Exchange アカウントを定義できます。もともと、このオブジェクト モデルは 1 つのプロファイルで 1 つの Exchange アカウントだけを実行するという前提で設計されました。新しくなったオブジェクト モデルは、複数の Exchange アカウントを処理できるように強化されています。

この記事では、オブジェクト モデルの重要な新機能について説明します。また、新しいソリューションを作成したり、既存のコードを Outlook 2010 に適応させたりするときに役立つ C# のコード例も示します。

注意

この記事のオブジェクト、プロパティ、メソッド、およびイベントは、Outlook 2010 の最終リリースで変更される可能性があります。また、追加の機能が導入される可能性もあります。ソリューションをリリースする前に、必ず Outlook 2010 の最終バージョンでコードの変更部分をテストしてください。

Outlook オブジェクト モデルの変更点

Outlook オブジェクト モデルには、Outlook 2010 の新機能をプログラムによってサポートする新しいオブジェクト、メソッド、プロパティ、およびイベントが追加されています。また、Outlook プラットフォームに関して開発者から頻繁に寄せられる個々の変更の要望に対応するための拡張も行われています。

Outlook 2010 の既存の Outlook オブジェクトおよびコレクションの機能強化

次の表は、以前のバージョンの Outlook から機能が強化されたオブジェクトとコレクションを示しています。2 列目は、新しいメソッド、プロパティ、およびイベントだけを示しています。

表 1. Outlook オブジェクト モデルの機能強化

オブジェクトとコレクション

新しいメンバー

Account

メソッド

GetAddressEntryFromID(String)

GetRecipientFromID(String)

プロパティ

AutoDiscoverConnectionMode

AutoDiscoverXml

CurrentUser

DeliveryStore

ExchangeConnectionMode

ExchangeMailboxServerName

ExchangeMailboxServerVersion

Accounts

イベント

AutoDiscoverComplete

Application

メソッド

RefreshFormRegionDefinition(String)

プロパティ

PickerDialog

AppointmentItem

メソッド

CopyTo(MAPIFolder, OlAppointmentCopyOptions)

GetConversation()

GetOrganizer()

プロパティ

ConversationID

RTFBody

イベント

AfterWrite

BeforeRead

Attachment

メソッド

GetTemporaryFilePath()

AttachmentSelection

メソッド

GetSelection(OlSelectionContents)

プロパティ

Location

CalendarView

プロパティ

SelectedEndTime

SelectedStartTime

ContactItem

メソッド

GetConversation()

プロパティ

ConversationID

RTFBody

イベント

AfterWrite

BeforeRead

DistListItem

メソッド

GetConversation()

プロパティ

ConversationID

RTFBody

DocumentItem

イベント

AfterWrite

BeforeRead

ExchangeUser

メソッド

GetPicture()

Explorer

メソッド

AddToSelection(Object)

ClearSelection()

IsItemSelectableInView(Object)

RemoveFromSelection(Object)

SelectAllItems()

プロパティ

AccountSelector

AttachmentSelection

イベント

AttachmentSelectionChange

Folder

メソッド

GetCustomIcon()

SetCustomIcon(StdPicture)

FormRegion

プロパティ

Visible

Inspector

メソッド

SetSchedulingStartTime(DateTime)

プロパティ

AttachmentSelection

イベント

AttachmentSelectionChange

JournalItem

メソッド

GetConversation()

プロパティ

ConversationID

イベント

AfterWrite

BeforeRead

MailItem

メソッド

GetConversation()

プロパティ

ConversationID

PermissionTemplateGuid

RetentionExpirationDate

RetentionPolicyName

RTFBody

Sender

イベント

AfterWrite

BeforeRead

MeetingItem

メソッド

GetConversation()

プロパティ

ConversationID

IsLatestVersion

RTFBody

SendUsingAccount

イベント

AfterWrite

BeforeRead

NameSpace

メソッド

CreateContactCard(AddressEntry)

PostItem

メソッド

GetConversation()

プロパティ

ConversationID

RTFBody

イベント

AfterWrite

BeforeRead

Recipient

プロパティ

Sendable

RemoteItem

メソッド

GetConversation()

プロパティ

ConversationID

イベント

AfterWrite

BeforeRead

ReportItem

メソッド

GetConversation()

プロパティ

ConversationID

イベント

AfterWrite

BeforeRead

Selection

メソッド

GetSelection(OlSelectionContents)

プロパティ

Location

SharingItem

メソッド

GetConversation()

プロパティ

ConversationID

PermissionTemplateGuid

RetentionExpirationDate

RetentionPolicyName

RTFBody

イベント

AfterWrite

BeforeRead

Store

メソッド

GetDefaultFolder(OlDefaultFolders)

RefreshQuotaDisplay()

プロパティ

Categories

IsConversationEnabled

TableView

メソッド

GetTable()

プロパティ

AlwaysExpandConversation

ShowConversationByDate

ShowConversationSendersAboveSubject

ShowFullConversations

TaskItem

TaskRequestAcceptItem

TaskRequestDeclineItem

TaskRequestItem、および

TaskRequestUpdateItem

メソッド

GetConversation

プロパティ

ConversationID

RTFBody

ViewFont

プロパティ

ExtendedColor

Outlook 2010 の新しい Outlook オブジェクトおよびコレクション

次の表は、Outlook 2010 で導入された新しいオブジェクトを示しています。オブジェクトのすべてのメンバーを 2 列目に示します。

表 2. Outlook オブジェクト モデルに追加されたオブジェクト

オブジェクト

メソッド、プロパティ、およびイベント

AccountSelector

プロパティ

Application

Class

Parent

SelectedAccount

Session

イベント

SelectedAccountChange

Conversation

メソッド

ClearAlwaysAssignCategories(Store)

GetAlwaysAssignCategories(Store)

GetAlwaysDelete(Store)

GetAlwaysMoveToFolder(Store)

GetChildren(Object)

GetParent(Object)

GetRootItems()

GetTable()

MarkAsRead()

MarkAsUnread()

SetAlwaysAssignCategories(String, Store)

SetAlwaysDelete(OlAlwaysDeleteConversation, Store)

SetAlwaysMoveToFolder(MAPIFolder, Store)

StopAlwaysDelete(Store)

StopAlwaysMoveToFolder(Store)

プロパティ

Application

Class

ConversationID

Parent

Session

ConversationHeader

メソッド

GetConversation()

GetItems()

プロパティ

Application

Class

ConversationID

ConversationTopic

Parent

Session

MobileItem

メソッド

Close(OlInspectorClose)

Copy()

Delete()

Display(Object)

Forward()

Move(MAPIFolder)

PrintOut()

Reply()

ReplyAll()

Save()

SaveAs(String, Object)

Send(Boolean)

プロパティ

Actions

Application

Attachments

BillingInformation

Body

Categories

Class

Companies

ConversationIndex

ConversationTopic

Count

CreationTime

EntryID

FormDescription

GetInspector

HTMLBody

Importance

ItemProperties

LastModificationTime

MessageClass

Mileage

MobileFormat

NoAging

OutlookInternalVersion

OutlookVersion

Parent

PropertyAccessor

ReceivedByEntryID

ReceivedByName

ReceivedTime

Recipients

ReplyRecipientNames

ReplyRecipients

Saved

SenderEmailAddress

SenderEmailType

SenderName

SendUsingAccount

Sensitivity

Sent

SentOn

Session

Size

SMILBody

Subject

Submitted

To

UnRead

UserProperties

イベント

AfterWrite

AttachmentAdd

AttachmentRead

AttachmentRemove

BeforeAttachmentAdd

BeforeAttachmentPreview

BeforeAttachmentRead

BeforeAttachmentSave

BeforeAttachmentWriteToTempFile

BeforeAutoSave

BeforeCheckNames

BeforeDelete

BeforeRead

Close

CustomAction

CustomPropertyChange

Forward

Open

PropertyChange

Read

Reply

ReplyAll

Send

Unload

Write

SimpleItems

プロパティ

Application

Class

Count

Item[Object]

Parent

Session

SolutionsModule

メソッド

AddSolution(MAPIFolder, OlSolutionScope)

プロパティ

Application

Class

Name

NavigationModuleType

Parent

Position

Session

Visible

アドインの弾力性

アドインの弾力性は、Outlook 2010 プラットフォームの重要な機能です。アドインの弾力性とは、アドインを読み込む前と読み込んだ後で、Outlook のパフォーマンスと応答性が通常どおり維持されることを意味します。アドインは Outlook に対してインプロセスで実行され、Outlook のユーザー エクスペリエンスを低下させる可能性があります。さらに、IT 管理者は、管理されていない環境ではユーザーが実行しているアドインを必ずしも把握しているとは限らず、出来の悪いアドインのせいでヘルプデスクへの問い合わせや保有コストが増加することを懸念しています。Outlook オブジェクト モデルの呼び出しは、すべて Outlook のメインのフォアグラウンド スレッドで実行されるので、パフォーマンスを最優先目標としてコードを記述することが重要です。作成したコードによって Outlook の実行速度が低下したり、いつまでも一時停止したりすると、ユーザーはいらだって、そのソリューションを使わなくなります。

Windows イベント ログに記録されるアドインのインベントリと起動時間

Outlook 2010 では、ユーザーと IT 管理者が、Outlook の起動時に読み込まれるアドインの種類、およびそれらのアドインが起動時間に及ぼす影響を確認できます。Outlook が起動するときに、接続された各アドインの ID についての詳細な情報が Windows イベント ログに書き込まれます。さらに、接続された各アドインの起動時間がミリ秒単位でイベント ログに書き込まれます。

図 1. Windows イベント ログに記録された Outlook 2010 アドインとアドインごとの起動時間

Windows イベント ログ内のアドイン

アドインの高速シャットダウン

Outlook 2010 では、アドインの新しい高速シャットダウン プロセスが実施されます。この新しいシャットダウン プロセスによって、ユーザーが Outlook を終了した後もアドインがリソースを解放せずに長い待ち時間が生じるのを防ぐことができます。この変更により、既存の少数のアドインに悪影響が生じる可能性がありますが、アドイン ベンダーと IT 管理者は Outlook を標準のアドイン シャットダウン プロセスに強制的に戻すことで、そうした影響を軽減できます。

次に、アドインの高速シャットダウン プロセスに関するいくつかの要点を示します。

  • ユーザー操作で Outlook がシャットダウンされるときに、RemoveMode パラメーターが ext_DisconnectMode.ext_dm_HostShutdown に設定されていると、IDTExtensibility2 インターフェイスの OnDisconnection イベントが発生しません。

  • Microsoft Visual Studio Tools for Office のマネージ アドインでは、ユーザー操作で Outlook がシャットダウンされるときに ThisAddin クラスの Shutdown メソッドが呼び出されません。

  • [COM アドイン] ダイアログ ボックスのユーザー操作でアドインの接続が解除されるときに、RemoveMode が ext_DisconnectMode.ext_dm_UserClosed と等しい場合は、IDTExtensiblity2 インターフェイスの OnDisconnection イベントが発生します。

  • ユーザー操作で Outlook がシャットダウンされるときに、Outlook Application オブジェクトの Quit イベントが発生します。

アドインのシャットダウンとベスト プラクティスの詳細については、「Outlook 2010 でのシャットダウンの変更」を参照してください。

UI の拡張性の向上

Outlook 2010 では、開発者からの多くの要望に応じて、UI を次のような方法で拡張できるようになっています。

  • ナビゲーション ウィンドウの新しいソリューション モジュールに、カスタム フォルダーの階層を追加します。Outlook オブジェクト モデルでは、ソリューション モジュールは SolutionsModule オブジェクトで表されます。SolutionsModule オブジェクトが公開する AddSolution メソッドを使用して、ソリューション ルート フォルダーを追加できます。Outlook 2010 では、ソリューション ルート フォルダーのすべてのサブフォルダーが、ソリューション モジュールに表示されるソリューション フォルダー階層に自動的に追加されます。図 2 に示すソリューション モジュールの例を参照してください。

  • ソリューション フォルダーのフォルダー アイコンをカスタマイズします。Folder オブジェクトの SetCustomIcon メソッドと GetCustomIcon メソッドを使用して、フォルダー アイコンを設定および取得できます。

  • Office Fluent UI の拡張性を使用して、次のような Outlook UI をカスタマイズします。

    • エクスプローラー リボン

    • インスペクター リボン

    • ショートカット メニュー

    • [新しいアイテム] メニュー

    • 連絡先カード ショートカット メニュー

    • 操作別タブ

    • Microsoft Office Backstage ビュー

図 2. Outlook 2010 のソリューション モジュールの例

Outlook 2010 のサンプル ソリューション モジュール

既存のコードで Office コマンド バーをカスタマイズしている場合、それらの UI のカスタマイズは [アドイン] タブに表示されるため、ユーザーが簡単に見つけられないことがあります。Office Fluent UI の拡張性ガイドラインに従って、エクスプローラー リボン、Office Fluent UI ショートカット メニュー、および Backstage ビューを利用するようにコードを書き直してください。Outlook 2010 の UI の拡張性に関する総合的な情報、およびサンプル コードについては、以下の記事を参照してください。

包括的なオブジェクト モデル

包括的なオブジェクト モデルの目標は、開発者が MAPI コードを直接使用せずに本格的なソリューションを作成できるようにすることです。マネージ コードでは、MAPI を使用する Outlook ソリューションを開発できません。

スレッド用のオブジェクト モデル

Outlook 2010 では、スレッド ビューという強力な新機能と、Conversation という新しいオブジェクトが導入されています。Conversation オブジェクトを使用すると、スレッドの動詞を実行すること、およびスレッド ツリーを移動することができます。スレッド内のアイテムは、別のストアやフォルダーにあってもかまいません。

スレッド内のアイテムにアクセスするには、アイテムの GetConversation メソッドを呼び出して Conversation オブジェクトを取得します。Conversation オブジェクトは、親アイテムが属するスレッドを表します。

アイテムのスレッドが存在しない場合、GetConversation は Null (Visual Basic では Nothing) を返します。アイテムのスレッドが存在しないのは、以下のような場合です。

  • アイテムが保存されていない場合。アイテムの保存方法には、プログラムによる保存、ユーザー操作による保存、または AutoSave による保存があります。

  • 送信できるアイテムが送信されていない場合 (メール アイテム、予定アイテム、連絡先アイテムなど)。

  • Windows レジストリによってすべてのスレッドが無効になっている場合。

  • ストアがスレッドをサポートしていない場合 (たとえば、Outlook が Microsoft Exchange Server 2010 より前のバージョンの Microsoft Exchange に対して従来のオンライン モードで実行されている場合)。ストアがスレッドをサポートしているかどうかを調べるには、Store オブジェクトの IsConversationEnabled プロパティを使用します。

次の DemoConversation 関数は、Outlook エクスプローラー ウィンドウで選択されたアイテムの Conversation オブジェクトを取得します。スレッド内のアイテムの一覧を作成するには、Conversation オブジェクトの GetTable メソッドを使用して Table オブジェクトを取得します。その後、必要に応じて Table オブジェクトに列を追加することも、GetNextRow を呼び出して Table の各行を取得することもできます。

void DemoConversation()
    {
        object selectedItem = Application.ActiveExplorer().Selection[1];
        // For this example, you work only with 
        // MailItem. Other item types such as
        // MeetingItem and PostItem can participate 
        // in a conversation.
        if (selectedItem is Outlook.MailItem)
        {
            // Cast selectedItem to MailItem.
            Outlook.MailItem mailItem =
                selectedItem as Outlook.MailItem; ;
            // Determine store of MailItem.
            Outlook.Folder folder = mailItem.Parent
                as Outlook.Folder;
            Outlook.Store store = folder.Store;
            if (store.IsConversationEnabled == true)
            {
                // Obtain a Conversation object.
                Outlook.Conversation conv =
                    mailItem.GetConversation();
                // Check for null conversation.
                if (conv != null)
                {
                    // Obtain Table that contains rows 
                    // for each item in the conversation.
                    Outlook.Table table = conv.GetTable();
                    Debug.WriteLine("Conversation Items Count: " +
                        table.GetRowCount().ToString());
                    Debug.WriteLine("Conversation Items from Table:");
                    while (!table.EndOfTable)
                    {
                        Outlook.Row nextRow = table.GetNextRow();
                        Debug.WriteLine(nextRow["Subject"]
                            + " Modified: "
                            + nextRow["LastModificationTime"]);
                    }
                    Debug.WriteLine("Conversation Items from Root:");
                    // Obtain root items and enumerate Conversation.
                    Outlook.SimpleItems simpleItems 
                        = conv.GetRootItems();
                    foreach (object item in simpleItems)
                    {
                        // In this example, enumerate only the MailItem type.
                        // Other types such as PostItem or MeetingItem
                        // can appear in a conversation.
                        if (item is Outlook.MailItem)
                        {
                            Outlook.MailItem mail = item
                                as Outlook.MailItem;
                            Outlook.Folder inFolder =
                                mail.Parent as Outlook.Folder;
                            string msg = mail.Subject
                                + " in folder " + inFolder.Name;
                            Debug.WriteLine(msg);
                        }
                        // Call EnumerateConversation 
                        // to access child nodes of root items.
                        EnumerateConversation(item, conv);
                    }
                }
            }
        }
    }


    void EnumerateConversation(object item,
        Outlook.Conversation conversation)
    {
        Outlook.SimpleItems items =
            conversation.GetChildren(item);
        if (items.Count > 0)
        {
            foreach (object myItem in items)
            {
                // In this example, enumerate only MailItem type.
                // Other types such as PostItem or MeetingItem
                // can appear in a conversation.
                if (myItem is Outlook.MailItem)
                {
                    Outlook.MailItem mailItem =
                        myItem as Outlook.MailItem;
                    Outlook.Folder inFolder =
                        mailItem.Parent as Outlook.Folder;
                    string msg = mailItem.Subject
                        + " in folder " + inFolder.Name;
                    Debug.WriteLine(msg);
                }
                // Continue recursion.
                EnumerateConversation(myItem, conversation);
            }
        }
    }

スレッドの各ノードを移動する場合のもう 1 つの方法は、GetRootItems メソッドを呼び出して、スレッドの 1 つ以上のルート アイテムを取得することです。元の 1 つのルート アイテムが削除され、複数の子アイテムがルート アイテムに昇格した場合、スレッドに複数のルート アイテムが含まれることがあります。ルート アイテムを取得したら、各ルート アイテムのすべての子ノードの SimpleItems コレクションを取得できます。SimpleItems は、スレッド内の各ノードの子アイテムを列挙する場合に使用できるコレクション オブジェクトです。foreach ループを使用してコレクションの各アイテムを列挙するときに、EnumerateConversation 関数を再帰的に呼び出して、スレッド内の子アイテムに 1 つずつアクセスします。EnumerateConversation 関数には 2 つのパラメーターを指定できます。1 つは MailItem など、アイテムを表すパラメーターで、もう 1 つは Conversation オブジェクトを表すパラメーターです。Conversation オブジェクトの GetChildren メソッドは、スレッド内の特定のアイテムの子ノードを表す SimpleItems コレクションを返します。SimpleItems.Count がゼロより大きい場合は、子ノードの列挙が続行され、各子ノードに対して EnumerateConversation が呼び出されます。

Conversation オブジェクトは、スレッドの動詞をスレッドに適用するためのメソッドも公開しています。具体的には、Outlook 2010 で Conversation オブジェクトの次のメソッドを使用できます。

表 3. Conversation オブジェクトのメソッド

メソッド

説明

ClearAlwaysAssignCategories

スレッド内のすべてのアイテムからすべての分類項目を削除し、Outlook がスレッド内のアイテムに常に分類項目を割り当てる処理を停止します。

GetAlwaysAssignCategories

スレッドで受信するすべての新しいアイテムに割り当てられる 1 つまたは複数の分類項目を示す String を取得します。

GetAlwaysDelete

スレッドで受信するすべての新しいアイテムを、指定した配信ストアの削除済みアイテム フォルダーに常に移動するかどうかを示す OlAlwaysDeleteConversation 列挙の定数を取得します。

GetAlwaysMoveToFolder

スレッドで受信するすべての新しいアイテムを常に移動する、指定した配信ストアの Folder オブジェクトを取得します。

MarkAsRead

スレッド内のすべてのアイテムを既読にします。

MarkAsUnread

スレッド内のすべてのアイテムを未読にします。

SetAlwaysAssignCategories

スレッドの既存のすべてのアイテムおよび今後受信するすべてのアイテムに 1 つ以上の分類項目を適用します。

SetAlwaysDelete

スレッドの既存のすべてのアイテムおよびスレッドで受信するすべての新しいアイテムを、指定した配信ストアの削除済みアイテム フォルダーに常に移動するかどうかを示す OlAlwaysDeleteConversation 列挙の定数を設定します。

SetAlwaysMoveToFolder

スレッドの既存のすべてのアイテムおよびスレッドで受信するすべての新しいアイテムを常に移動する、指定した配信ストア内の Folder オブジェクトを設定します。

StopAlwaysDelete

指定したストアのスレッド アイテムを、そのストアの削除済みアイテム フォルダーに常に移動する処理を停止します。

StopAlwaysMoveToFolder

指定したストアのスレッド アイテムを特定のフォルダーに常に移動する処理を停止します。

たとえば、無視する処理を指定すると、スレッド内の現在のアイテムと今後受信するアイテムが、すべて削除済みアイテム フォルダーに移動します。無視する処理を繰り返すコードを記述するには、SetAlwaysDelete メソッドを使用して、スレッド内のすべてのアイテムを常に削除し、新しいスレッド アイテムはすべて削除済みアイテム フォルダーに移動します。無視する処理をプログラムによって無効にするには、StopAlwaysDelete メソッドを呼び出します。次のコード例は、SetAlwaysDelete メソッドの使用方法を示しています。

void DemoIgnoreConversation()
    {
        // Obtain the selection.
        object selectedItem =
            Application.ActiveExplorer().Selection[1];
        if (selectedItem is Outlook.MailItem)
        {
            // Cast the object to MailItem.
            Outlook.MailItem mail = selectedItem
                as Outlook.MailItem; 
            // Determine the store of mail.
            Outlook.Folder folder = mail.Parent
                as Outlook.Folder;
            Outlook.Store store = folder.Store;
            if (store.IsConversationEnabled == true)
            {
                Outlook.Folder delItems =
                    store.GetDefaultFolder(
                    Outlook.OlDefaultFolders.olFolderDeletedItems)
                    as Outlook.Folder;
                Outlook.Conversation conv = mail.GetConversation();
                if (conv != null)
                {
                    conv.SetAlwaysDelete(
                        Outlook.OlAlwaysDeleteConversation.olAlwaysDelete,
                        delItems.Store);
                }
            }
        }
    }

差出人の SMTP アドレスの取得

Microsoft Office Outlook 2007 では、開発者は次のようなコードで PropertyAccessor オブジェクトを使用して、差出人の SMTP アドレスを取得していました。

private string GetSenderSMTPAddress(Outlook.MailItem mail)
    {
        if (mail == null)
        {
            throw new ArgumentNullException();
        }
        string PR_SENT_REPRESENTING_ENTRYID =
            @"https://schemas.microsoft.com/mapi/proptag/0x00410102";
        string PR_SMTP_ADDRESS =
            @"https://schemas.microsoft.com/mapi/proptag/0x39FE001E";
        if (mail.SenderEmailType == "EX")
        {
            string senderEntryID =
                mail.PropertyAccessor.BinaryToString(
                mail.PropertyAccessor.GetProperty(
                PR_SENT_REPRESENTING_ENTRYID));
            Outlook.AddressEntry sender =
                Application.Session.
                GetAddressEntryFromID(senderEntryID);
            if (sender != null)
            {
                // Now there is an AddressEntry that represents the sender.
                if (sender.AddressEntryUserType ==
                    Outlook.OlAddressEntryUserType.
                    olExchangeUserAddressEntry
                    || sender.AddressEntryUserType ==
                    Outlook.OlAddressEntryUserType.
                    olExchangeRemoteUserAddressEntry)
                {
                    // Use the PrimarySMTPAddress property of the
                    // ExchangeUser object.
                    Outlook.ExchangeUser exchUser =
                        sender.GetExchangeUser();
                    if (exchUser != null)
                    {
                        return exchUser.PrimarySmtpAddress;
                    }
                    else
                    {
                        return null;
                    }
                }
                else
                {
                    return sender.PropertyAccessor.GetProperty(
                        PR_SMTP_ADDRESS) as string;
                }
            }
            else
            {
                return null;
            }
        }
        else
        {
            return mail.SenderEmailAddress;
        }
    }

Outlook 2010 では、MailItem オブジェクトの Sender プロパティを使用して、アイテムの差出人を表す AddressEntry オブジェクトを取得または設定します。PropertyAccessor オブジェクトを使用して PR_SENT_REPRESENTING_ENTRYID (PidTagSentRepresentingEntryId) プロパティを確認する必要はなくなりました。代わりに、次の例のようなコードを記述できます。

private string GetSenderSMTPAddress2010(Outlook.MailItem mail)
    {
        string PR_SMTP_ADDRESS =
            @"https://schemas.microsoft.com/mapi/proptag/0x39FE001E";
        if (mail == null)
        {
            throw new ArgumentNullException();
        }
        if (mail.SenderEmailType == "EX")
        {
            Outlook.AddressEntry sender =
                mail.Sender;
            if (sender != null)
            {
                // Now there is an AddressEntry that represents the sender.
                if (sender.AddressEntryUserType ==
                    Outlook.OlAddressEntryUserType.
                    olExchangeUserAddressEntry
                    || sender.AddressEntryUserType ==
                    Outlook.OlAddressEntryUserType.
                    olExchangeRemoteUserAddressEntry)
                {
                    // Use the PrimarySMTPAddress property of the
                    // ExchangeUser object.
                    Outlook.ExchangeUser exchUser =
                        sender.GetExchangeUser();
                    if (exchUser != null)
                    {
                        return exchUser.PrimarySmtpAddress;
                    }
                    else
                    {
                        return null;
                    }
                }
                else
                {
                    return sender.PropertyAccessor.GetProperty(
                        PR_SMTP_ADDRESS) as string;
                }
            }
            else
            {
                return null;
            }
        }
        else
        {
            return mail.SenderEmailAddress;
        }
    }

PropertyAccessor の機能強化

PropertyAccessor オブジェクトは、オブジェクトのプロパティを作成、設定、取得、および削除するときに使用します。Outlook 2007 の PropertyAccessor オブジェクトには、GetProperty または GetProperties 呼び出しで取得できるプロパティのサイズに制限がありました。Outlook 2010では、これらの制限が解消されています。

また、Outlook 2010 の PropertyAccessor オブジェクトを使用すると、Attachment オブジェクトの SaveAsFile メソッドを使用して添付ファイルをディスクに書き込まずに、添付ファイルを操作できます。次のコード例では、PropertyAccessor オブジェクトを使用して Attachment オブジェクトからバイト配列を取得し、メモリ内でバイト配列を A から B に変更した後、Attachment オブジェクトを変更後のバイト配列に設定します。変更を保持するために、アイテムの Save メソッドを呼び出します。

    private void DemoAttachmentStream()
    {
        const string PR_ATTACH_DATA_BIN = 
            "https://schemas.microsoft.com/mapi/proptag/0x37010102";
        // Create a mail item.
        Outlook.MailItem mail = 
            Application.CreateItem(Outlook.OlItemType.olMailItem) 
            as Outlook.MailItem;
        mail.Subject = "Demo Attachment Stream";
        // Create the c:\demo folder if it does not exist.
        if(!Directory.Exists(@"c:\demo"))
        {
            Directory.CreateDirectory(@"c:\demo");
        }
        // Write to the attach.txt file.
        StreamWriter sw = new StreamWriter(@"c:\demo\attach.txt");
        char charA = 'A';
        string myString = new string(charA ,4096);
        sw.WriteLine(myString);
        sw.Close();
        // Add attach.txt as an attachment.
        Outlook.Attachment attach = 
            mail.Attachments.Add(@"c:\demo\attach.txt",
            Outlook.OlAttachmentType.olByValue, 
            Type.Missing, 
            Type.Missing);
        // Save the item.
        mail.Save();
        // Use PropertyAccessor to retrieve attachment byte stream.
        byte[] attachStream = 
            attach.PropertyAccessor.GetProperty(
            PR_ATTACH_DATA_BIN) as byte[];
        // Iterate the stream and change "A" to "B".
        for (int i = 0; i < attachStream.Length; i++)
        {
            attachStream[i] = 0x42; //Hex for "B"
        }
        // Set PR_ATTACH_DATA_BIN to attachStream.
        attach.PropertyAccessor.SetProperty(PR_ATTACH_DATA_BIN, 
            attachStream);
        // Save the item again.
        mail.Save();
    }

リッチ テキスト形式 (RTF) へのアクセス

Outlook では、Inspector オブジェクトの WordEditor プロパティによって、アイテムの本文の高度な書式設定へのアクセスがサポートされます。WordEditor は、Microsoft Word オブジェクト モデルの Word.Document オブジェクトを表します。Inspector.WordEditor は、Outlook アイテムがインスペクターに表示される場合に適しています。インスペクター ウィンドウが表示されない場合のために、Outlook 2010 では、MailItem、AppointmentItem などのアイテム オブジェクトに RTFBody プロパティが導入されています。RTFBody は、NoteItem と JournalItem を除くすべての種類のアイテムで公開されます。RTFBody は値の取得と設定が可能なプロパティで、アイテムの RTF ストリームを表すバイト配列を設定または取得できます。開発環境によっては、RTFBody から取得したバイト配列を文字列に変換し、必要に応じて RTF が含まれる文字列を変更し、文字列をバイト配列に変換してから、RTFBody を変更後のバイト配列に設定する必要があります。

次のコード例では、アクティブなエクスプローラー ウィンドウの Selection オブジェクトの最初のアイテムの RTF を Visual Studio の [デバッグ トレース リスナー] ウィンドウに書き込みます。このコードはメール オブジェクトからバイト配列を取得し、System.Text.AsciiEncoding を使用してバイト配列を文字列に変換します。

private void GetRTFBodyForMail()
{
    Outlook.Selection selection = 
        Application.ActiveExplorer().Selection;
    if(selection.Count >= 1)
    {
        if (selection[1] is Outlook.MailItem)
        {
            Outlook.MailItem mail =
                selection[1] as Outlook.MailItem;
            byte[] byteArray = mail.RTFBody as byte[];
            System.Text.Encoding encoding = 
                new System.Text.ASCIIEncoding();
            string RTF = encoding.GetString(byteArray);
            Debug.WriteLine(RTF);
        }
    }
}

ビューに表示されているアイテムの取得

Outlook 2010 では、TableView オブジェクトの GetTable メソッドを呼び出して、ビューに表示されているアイテムを取得できます。GetTable は Table オブジェクトを返しますが、Folder.GetTable を実行するときのようにメソッドにパラメーターを指定することはできません。GetTable は、ビューに制限が含まれるためにビューのアイテムがフォルダー内のアイテムと異なる場合や、クイック検索のクエリで複数のフォルダーやストアのアイテムが返される場合に使用します。次のコード例では、受信トレイの現在のビューから Table オブジェクトを取得します。TableView.GetTable 呼び出しを正しく実行するには、受信トレイが現在のフォルダーになっている必要があります。表示されているエクスプローラー ウィンドウの現在のフォルダーではないフォルダーに対して TableView.GetTable を呼び出すと、Outlook でエラーが発生します。

private void DemoViewGetTable()
    {
        // Obtain the Inbox folder.
        Outlook.Folder inbox =
            Application.Session.GetDefaultFolder(
            Outlook.OlDefaultFolders.olFolderInbox)
            as Outlook.Folder;
        // Set ActiveExplorer.CurrentFolder to Inbox.
        // Inbox must be the current folder
        // for View.GetTable to work correctly.
        Application.ActiveExplorer().CurrentFolder = inbox;
        // Ensure that the current view is TableView.
        if (inbox.CurrentView.ViewType == 
            Outlook.OlViewType.olTableView)
        {
            Outlook.TableView view = 
                inbox.CurrentView as Outlook.TableView;
            // No arguments are needed for View.GetTable.
            Outlook.Table table = view.GetTable();
            Debug.WriteLine("View Count=" 
                + table.GetRowCount().ToString());
            while (!table.EndOfTable)
            {
                // First row in Table.
                Outlook.Row nextRow = table.GetNextRow();
                Debug.WriteLine(nextRow["Subject"]
                    + " Modified: "
                    + nextRow["LastModificationTime"]);
            }
        }
    }

Selection オブジェクトの機能強化

Selection オブジェクトの機能が強化され、選択項目の UI 領域について開発者に通知する Location プロパティが追加されています。Location プロパティは値の取得のみ可能で、OlSelectionLocation 列挙の値を返します。以前のバージョンの Outlook では、Selection オブジェクトにビュー リストで選択されたアイテムのみが格納されていました。Outlook 2010 では、Selection.Location を使用して、次のいずれかの OlSelectionLocation の値を取得できます。

表 4. OlSelectionLocation の戻り値

説明

olViewList

ビュー リストで選択されたアイテム。

olToDoBarTaskList

To Do バーのタスク リストで選択されたアイテム。

olToDoBarAppointmentList

To Do バーの予定リストで選択されたアイテム。

olDailyTaskList

予定表ビューの日毎のタスク リストで選択されたアイテム。

olAttachmentWell

Outlook エクスプローラーの閲覧ウィンドウの添付ファイル ストリップ、または Outlook インスペクターの添付ファイル ストリップにある選択された添付ファイル。

選択項目が変わると、olAttachmentWell を除いて、前に列挙されたすべての選択項目の位置について SelectionChange イベントが発生します。添付ファイル ストリップで添付ファイルが選択されると、AttachmentSelectionChange イベントが発生します。SelectionChange イベントと AttachmentSelectionChange イベントは、どちらも Explorer オブジェクトにあります。

SelectionChange イベントが発生したときに Selection オブジェクトを列挙する場合は、種類の異なるアイテムをコードで適切に処理できるようにしてください。Selection オブジェクトに格納されるのは MailItem オブジェクトのみであると考えないでください。

機能強化された Outlook 2010 の Selection オブジェクトは、Outlook 2010 の新しいスレッド ビューを含めて、あらゆる種類のビューに対応しています。現在のビューがスレッド ビューかどうかを調べるには、次のプロパティが役立ちます。

表 5. TableView のプロパティ

TableView のプロパティ

説明

AlwaysExpandConversation

スレッドが表ビューで常にすべて展開されるかどうかを示す値を取得または設定します。値の取得および設定が可能です。

ShowConversationByDate

表ビューのアイテムがスレッドの日付とスレッドによって分類されるかどうかを示す Boolean 値を取得または設定します。値の取得および設定が可能です。

ShowFullConversations

送信済みアイテム フォルダーなど、他のフォルダーのスレッド アイテムを表ビューのスレッドの一部として表示するかどうかを示す Boolean 値を取得または設定します。値の取得および設定が可能です。

TableView.ShowConversationByDate の値が true の場合、ビューでは Outlook 2010 の新しいスレッドの並べ替えが使用されています。現在のビューがスレッド ビューの場合、スレッドは単一アイテムのスレッド、分割されたスレッド、または展開されたスレッドになります。選択項目は、選択されたアイテムがスレッドの見出しか、展開されたスレッドか (展開されたスレッドでは複数のアイテムを選択できます) によって変わります。さらに、Outlook 2010 では新しい ConversationHeader オブジェクトが追加されており、ビューで 1 つ以上のスレッドの見出しを選択できます。ビューでスレッドの見出しが選択されているかどうかを調べるには、Selection オブジェクトの新しい GetSelection メソッドを使用し、OlSelectionContents.olConversationHeaders をメソッドに渡します。GetSelection メソッドを呼び出すと、Selection オブジェクトが返されますが、この場合、Selection オブジェクトには、MailItem オブジェクト、MeetingItem オブジェクトなどのアイテム オブジェクトではなく、ConversationHeader オブジェクトが格納されています。次の DemoConversationHeadersFromSelection 関数は、スレッド ビューで選択されたスレッドの見出しのすべてのアイテムを列挙します。

private void DemoConversationHeadersFromSelection()
{
    // Obtain the Inbox folder.
    Outlook.Folder inbox =
        Application.Session.GetDefaultFolder(
        Outlook.OlDefaultFolders.olFolderInbox)
        as Outlook.Folder;
    // Set ActiveExplorer.CurrentFolder to the Inbox.
    // Inbox must be the current folder.
    Application.ActiveExplorer().CurrentFolder = inbox;
    //Ensure that current view is a TableView object.
    if (inbox.CurrentView.ViewType ==
        Outlook.OlViewType.olTableView)
    {
        Outlook.TableView view =
            inbox.CurrentView as Outlook.TableView;
        if (view.ShowConversationByDate == true)
        {
            Outlook.Selection selection =
                Application.ActiveExplorer().Selection;
            Debug.WriteLine("Selection.Count = " + selection.Count);
            // Call GetSelection to create
            // a Selection object that contains ConversationHeader objects.
            Outlook.Selection convHeaders =
                selection.GetSelection(
                Outlook.OlSelectionContents.olConversationHeaders)
                as Outlook.Selection;
            Debug.WriteLine("Selection.Count (ConversationHeaders) = " 
                + convHeaders.Count);
            if (convHeaders.Count >= 1)
            {
                foreach (Outlook.ConversationHeader convHeader in
                    convHeaders)
                {
                    // Enumerate the items in the ConversationHeader.
                    Outlook.SimpleItems items = convHeader.GetItems();
                    for (int i = 1; i <= items.Count; i++)
                    {
                        // Enumerate only MailItem objects in this example.
                        if (items[i] is Outlook.MailItem)
                        {
                            Outlook.MailItem mail = 
                                items[i] as Outlook.MailItem;
                            Debug.WriteLine(mail.Subject 
                                + " Received:" + mail.ReceivedTime);
                        }
                    }
                }
            }
        }
    }
}

32 ビットおよび 64 ビットのプラットフォームのサポート

ここでは、32 ビットまたは 64 ビットの Outlook 2010 がインストールされた 32 ビットまたは 64 ビットの Windows を使用するときに、Outlook の拡張性に影響を与えるいくつかの事柄について説明します。

オペレーティング システムと Office での 64 ビット版の Outlook のサポート

Microsoft Office 2010 からは、Outlook が 32 ビット版または 64 ビット版のアプリケーションとして提供されます。同じコンピューター上でどちらのビットの Outlook を使用するかは、Windows オペレーティング システムのビット (x86 または x64) と、コンピューターに既に Office がインストールされている場合は、その Office のビットによって決まります。次に、32 ビット版と 64 ビット版のどちらの Outlook をインストールできるかを決めるいくつかの要素を示します。

  • 32 ビットの Office (および 32 ビットの Outlook) は、32 ビット版と 64 ビット版の Windows オペレーティング システムにインストールできます。64 ビットの Office (および 64 ビットの Outlook) は、64 ビット版の Windows オペレーティング システムにのみインストールできます。

  • 既定では、64 ビット版の Windows オペレーティング システムに 32 ビットの Office がインストールされます。

  • 同じコンピューター上に既に Office がインストールされている場合、インストールされる Outlook のビットは、常に Office のビットと同じになります。つまり、64 ビットの Word や 64 ビットの Microsoft Excel など、64 ビット版の他の Office アプリケーションが既にインストールされているコンピューターに、32 ビット版の Outlook をインストールすることはできません。同様に、32 ビット版の他の Office アプリケーションが既にインストールされているコンピューターに、64 ビット版の Outlook をインストールすることはできません。

64 ビット版の Outlook で実行される既存のアプリケーションに関する考慮点

64 ビット版の Office がインストールされている 64 ビット版の Windows オペレーティング システムで 32 ビット アプリケーションを実行する場合は、次の点を考慮してください。

  • オブジェクト モデルの呼び出しは、通常、32 ビット版と 64 ビット版のどちらの Outlook でも変更なしに機能します。

  • 32 ビット版の Outlook (Outlook 2010 より前のすべてのバージョンの Outlook を含む) 用にコンパイルしたネイティブのアドインは、64 ビット版の Outlook 用に再コンパイルする必要があります。

  • Microsoft Visual Studio Tools for the Microsoft Office system 3.0、および Visual Studio 2010 の Microsoft Office 開発ツールを使用して作成した Outlook アドインは、32 ビット版と 64 ビット版のどちらの Office でも機能します。ただし、[プロジェクトのプロパティ] ダイアログ ボックスの [ビルド] タブで、ターゲット プラットフォームに [Any CPU] オプションを指定してコンパイルされている必要があります。

  • Outlook オブジェクト モデルを使用する 32 ビット スタンドアロン アプリケーション (.exe) は、64 ビット版の Outlook 用に再コンパイルする必要があります。

64 ビット版の Outlook での Messaging API (MAPI) の変更点

32 ビット版の Outlook と 64 ビット版の Outlook で Outlook 2010 オブジェクト モデルに違いはありませんが、64 ビット版の Outlook と共に 64 ビットの MAPI が導入されたことで、MAPI の関数が少し変更されています。通常、これらの変更点は、ULONG_PTR など、MAPI の関数に渡す必要がある 64 ビット型に関係しています。

MAPI アプリケーションには、Microsoft Communicator や MFCMAPI (英語) などのスタンドアロン アプリケーションと、アドレス帳プロバイダー、ストア プロバイダー、トランスポート プロバイダーなどのサービス プロバイダーがあります。MAPI のメソッドや関数の呼び出しが MAPI アプリケーションで動作するには (簡易 MAPI 関数の MAPISendMail を除いて)、MAPI アプリケーションのビットが、アプリケーションの実行対象であるコンピューターの MAPI サブシステムのビットと一致している必要があります。さらに、MAPI サブシステムのビットは、インストールされている Outlook のビットによって決まり、両方のビットは常に同じになります。

MAPI を直接呼び出すネイティブなソリューションを使用している場合は、「Welcome to the Outlook 2010 MAPI Reference」で、64 ビット版の Outlook で動作するようにソリューションを移植する方法を参照してください。MAPI の開発者に特に役立つのが以下のトピックです。

Exchange クライアント拡張機能の廃止

Outlook 2010 では Exchange クライアント拡張機能 (ECE) を使用できなくなっています。ECE は、1995 年に Microsoft Exchange クライアントと共に導入されました。当時のクライアントは、Exchange Server の最初のバージョンに対して実行される 16 ビットのメール アプリケーションでした。ECE は、通常、C++ を使用して、MAPI に大きく依存するネイティブ コードで記述する必要があります。Outlook が Exchange クライアントに取って代わっても、Outlook 2000 で COM アドイン (英語)が ECE に取って代わるまで、ECE は Outlook 97/98 の機能を拡張するために使用されました。

Outlook 2007 とそれ以前のバージョンでは、ECE は引き続き所定の動作をします。しかし、32 ビット版と 64 ビット版の Outlook 2010 では、ECE は読み込まれません。既存の ECE ソリューションを再設計する場合は、次のオプションを検討してください。

  • ネイティブ コードまたはマネージ コードを使用して、ECE を COM アドインとして作成し直します。ECE と異なり、アドインは Outlook 2010 で完全にサポートされている戦略的な拡張性テクノロジです。Outlook アドインを使用することで、Outlook フォーム領域を作成し、Office Fluent UI を拡張できます。詳細については、MSDN の「Building an Outlook 2007 Form Region with a Managed Add-In (英語)」、「Office Fluent ユーザー インターフェイス デベロッパー ポータル」、および「Outlook デベロッパー ポータル」を参照してください。

  • ネイティブ コードと MAPI を使用して、ECE を Windows サービス アプリケーションとして作成し直します。Windows サービス アプリケーションを作成する場合は、Outlook オブジェクト モデルではなく MAPI を使用して Outlook アイテムにアクセスする必要があります。

CDO 1.21 の Outlook 2010 サポート対象からの除外

コラボレーション データ オブジェクト (CDO) 1.2.1 は、Extended MAPI 機能の上にシン ラッパーを提供するクライアント ライブラリです。CDO は Outlook 2010 と一緒にインストールされず、ダウンロードして利用する必要があります。詳細については、Microsoft Download Center の「Collaboration Data Objects, version 1.2.1 (英語)」を参照してください。複数の Exchange アカウントを使用している環境では、CDO の正常な動作は保証されません。CDO 1.2.1 は 32 ビットのクライアント ライブラリで、64 ビット版の Outlook 2010 では動作しません。したがって、Outlook 2010 での CDO 1.2.1 の使用はサポートされません。CDO 1.2.1 の機能の大部分は Outlook 2010 オブジェクト モデルに取り込まれています。CDO 1.2.1 の代替手段として、CDO に依存する既存のソリューションは Outlook オブジェクト モデルを使用するか MAPI を直接使用するように更新してください。

複数の Exchange アカウント

Outlook 2010 の優れた新機能の 1 つが、複数の Exchange アカウントを実行する機能です。Outlook オブジェクト モデルは、もともと特定のプロファイルで 1 つの Exchange アカウントだけを使用することを前提に設計されました。Outlook 2007 では、Exchange アカウントに関連付けられたプロパティとメソッドが Namespace オブジェクトに用意されています。複数の Exchange アカウントに対応するために、Account オブジェクトでいくつかの新しいプロパティとメソッドが公開されるようになりました。ExchangeMailboxServerName、ExchangeMailboxServerVersion、ExchangeConnectionMode などのプロパティは、まだ Namespace オブジェクトにありますが、Exchange の標準アカウントにのみ適用される値を返します。プロファイルのすべての Exchange アカウントに関係する Exchange のプロパティに関しては、Account オブジェクトを使用してください。次の表は、Outlook 2010 で複数の Exchange アカウントをサポートするために Account オブジェクトに追加されたプロパティとメソッドを示しています。

表 6. Account オブジェクトに追加されたメンバー

名前

種類

説明

AutoDiscoverConnectionMode

プロパティ

アカウント メールボックスをホストする Exchange Server の自動検出サービスに使用される接続の種類を指定する OlAutoDiscoverConnectionMode 定数を返します。値の取得のみ可能です。

AutoDiscoverXml

プロパティ

アカウントに関連付けられた Exchange Server の自動検出サービスで取得された XML 内の情報を表す文字列を返します。値の取得のみ可能です。

CurrentUser

プロパティ

アカウントの現在のユーザー ID を表す Recipient オブジェクトを返します。値の取得のみ可能です。

DeliveryStore

プロパティ

アカウントの既定の配信ストアを表す Store オブジェクトを返します。アカウントに既定の配信ストアがない場合は Null (Visual Basic では Nothing) を返します。

ExchangeConnectionMode

プロパティ

アカウント メールボックスをホストする Exchange Server の現在の接続モードを示す OlExchangeConnectionMode 定数を返します。値の取得のみ可能です。

ExchangeMailboxServerName

プロパティ

アカウント メールボックスをホストする Exchange Server の名前を表す文字列を返します。

ExchangeMailboxServerVersion

プロパティ

アカウント メールボックスをホストする Exchange Server の完全なバージョン番号を返します。値の取得のみ可能です。

GetAddressEntryFromID

メソッド

ID で指定されたアドレス エントリを表す AddressEntry オブジェクトを返します。

GetRecipientFromID

メソッド

指定したエントリ ID で識別される Recipient オブジェクトを返します。

プロファイル内のアカウントの列挙

次の EnumerateAccounts 関数は、Account オブジェクトの新しいプロパティの使用方法を示す簡単な例です。

private void EnumerateAccounts()
    {
        Outlook.Accounts accounts =
            Application.Session.Accounts;
        foreach (Outlook.Account account in accounts)
        {
            try
            {
                StringBuilder sb = new StringBuilder();
                sb.AppendLine("Account: " + account.DisplayName);
                if (string.IsNullOrEmpty(account.SmtpAddress)
                    || string.IsNullOrEmpty(account.UserName))
                {
                    Outlook.AddressEntry oAE =
                        account.CurrentUser.AddressEntry
                        as Outlook.AddressEntry;
                    if (oAE.Type == "EX")
                    {
                        Outlook.ExchangeUser oEU =
                            oAE.GetExchangeUser()
                            as Outlook.ExchangeUser;
                        sb.AppendLine("UserName: " +
                            oEU.Name);
                        sb.AppendLine("SMTP: " +
                            oEU.PrimarySmtpAddress);
                        sb.AppendLine("Exchange Server: " +
                            account.ExchangeMailboxServerName);
                        sb.AppendLine("Exchange Server Version: " +
                            account.ExchangeMailboxServerVersion); 
                    }
                    else
                    {
                        sb.AppendLine("UserName: " +
                            oAE.Name);
                        sb.AppendLine("SMTP: " +
                            oAE.Address);
                    }
                }
                else
                {
                    sb.AppendLine("UserName: " +
                        account.UserName);
                    sb.AppendLine("SMTP: " +
                        account.SmtpAddress);
                    if (account.AccountType == 
                        Outlook.OlAccountType.olExchange)
                    {
                        sb.AppendLine("Exchange Server: " +
                            account.ExchangeMailboxServerName);
                        sb.AppendLine("Exchange Server Version: " +
                            account.ExchangeMailboxServerVersion); 
                    }
                }
                If (account.DeliveryStore !=null)
                {
                    sb.AppendLine("Delivery Store: " +
                        account.DeliveryStore.DisplayName);
                }
                sb.AppendLine("---------------------------------");
                Debug.Write(sb.ToString());
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
            }
        }
    }

送信可能なアイテムの作成とフォーム フィールドの設定

Outlook オブジェクト モデルで最もよく使用されるメソッドの 1 つが、Application オブジェクトの CreateItem メソッドです。このメソッドは複数アカウントに関する情報を持っておらず、常にプロファイルの標準アカウント用のアイテムを作成します。特定のフォルダーに関連付けられたアカウントを "認識する" 送信可能なアイテムを作成する場合は、現在のフォルダーの Store を調べた後、Accounts コレクションを列挙して、特定のアカウントの DeliveryStore が現在のフォルダーの Store プロパティと一致するかどうかを確認する必要があります。現在のフォルダーの Store プロパティの適切な Account がわかったら、MailItem の Sender プロパティや AppointmentItem の SendUsingAccount プロパティを設定できます。次の CreateMailItemUsingAccount 関数と CreateMeetingRequestUsingAccount 関数は、複数アカウントのシナリオでこの機能を処理する方法を示しています。

private void CreateMailItemFromAccount()
    {
        Outlook.AddressEntry addrEntry = null;
        Outlook.Folder folder =
            Application.ActiveExplorer().CurrentFolder 
            as Outlook.Folder;
        Outlook.Store store = folder.Store;
        Outlook.Accounts accounts =
            Application.Session.Accounts;
        foreach (Outlook.Account account in accounts)
        {
            if (account.DeliveryStore == store)
            {
                addrEntry =
                    account.CurrentUser.AddressEntry;
                break;
            }
        }
        Outlook.MailItem mail =
            Application.CreateItem(
            Outlook.OlItemType.olMailItem)
            as Outlook.MailItem;
        if (addrEntry != null)
        {
            mail.Sender = addrEntry;
        }
        mail.Display(false);
    }

    private void CreateMeetingRequestFromAccount()
    {
        Outlook.Account acct = null;
        Outlook.Folder folder =
            Application.ActiveExplorer().CurrentFolder
            as Outlook.Folder;
        Outlook.Store store = folder.Store;
        Outlook.Accounts accounts =
            Application.Session.Accounts;
        foreach (Outlook.Account account in accounts)
        {
            if (account.DeliveryStore == store)
            {
                acct = account;
                break;
            }
        }
        Outlook.AppointmentItem appt =
            Application.CreateItem(
            Outlook.OlItemType.olAppointmentItem)
            as Outlook.AppointmentItem;
        appt.MeetingStatus = 
            Outlook.OlMeetingStatus.olMeeting;
        if (acct != null)
        {
            appt.SendUsingAccount=acct;
        }
        appt.Display(false);
    }

Exchange ストアのグローバル アドレス一覧の判別

プロファイルに複数の Exchange アカウントがある場合、特定の Store オブジェクトで利用できる AddressLists を列挙することも、特定の Exchange ストアのグローバル アドレス一覧 (GAL) を判別することもできます。次のコード例では、GetGlobalAddressList 関数に渡された Store オブジェクトの GAL を表す AddressList オブジェクトを取得します。このコード例の GetGlobalAddressList 関数を使用して、ActiveExplorer().CurrentFolder の Store の GAL を表す AddressList オブジェクトを取得できます。このコード例は、複数の Exchange アカウントを使用している環境で Outlook の固有の動作を複製する方法を示しています。ユーザーが [新しい電子メール] をクリックしたときに [Outlook アドレス帳] ダイアログ ボックスに最初に表示されるアドレス一覧は、ストアが Exchange アカウントの配信ストアになっている場合、現在のフォルダーの Store のグローバル アドレス一覧になります。DisplayGlobalAddressListForStore 関数と GetGlobalAddressList 関数を使用して、動作をプログラムによって複製します。

        void DisplayGlobalAddressListForStore()
        {
            Outlook.Folder currentFolder =
                Application.ActiveExplorer().CurrentFolder
                as Outlook.Folder;
            Outlook.Store currentStore = currentFolder.Store;
            if (currentStore.ExchangeStoreType !=
                Outlook.OlExchangeStoreType.olNotExchange)
            {
                Outlook.SelectNamesDialog snd = 
                    Application.Session.GetSelectNamesDialog();
                Outlook.AddressList addrList = 
                    GetGlobalAddressList(currentStore);
                if (addrList != null)
                {
                    snd.InitialAddressList = addrList;
                    snd.Display();
                }
            }
        }
        public Outlook.AddressList GetGlobalAddressList(Outlook.Store store)
        {
            string  PR_EMSMDB_SECTION_UID = 
                @"https://schemas.microsoft.com/mapi/proptag/0x3D150102";
            if (store == null)
            {
                throw new ArgumentNullException();
            }
            Outlook.PropertyAccessor oPAStore = store.PropertyAccessor;
            string storeUID = oPAStore.BinaryToString(
                oPAStore.GetProperty(PR_EMSMDB_SECTION_UID));
            foreach (Outlook.AddressList addrList 
                in Application.Session.AddressLists)
            {
                Outlook.PropertyAccessor oPAAddrList = 
                    addrList.PropertyAccessor;
                string addrListUID = oPAAddrList.BinaryToString(
                    oPAAddrList.GetProperty(PR_EMSMDB_SECTION_UID));
                // Return addrList if match on storeUID
                // and type is olExchangeGlobalAddressList.
                if (addrListUID == storeUID && addrList.AddressListType ==
                    Outlook.OlAddressListType.olExchangeGlobalAddressList)
                {
                    return addrList;
                }
            }
            return null;
        }

配信ストアの AddressList オブジェクトの列挙

次のコード例では、Store オブジェクトと AddressList オブジェクトの両方の一意識別子となる Outlook 2010 のプロパティを使用します。この PR_EMSMDB_SECTION_UID というプロパティは、特定の AddressList が特定の Store オブジェクトに属しているかどうかを評価するために使用されます。Store オブジェクトは配信ストアを表している必要があります。複数の Exchange アカウントを使用している場合は、1 つの Store オブジェクトが特定の Exchange アカウントの配信ストアとして機能します。EnumerateAddressListsForStore 関数は、ActiveExplorer().CurrentFolder.Store のアドレス一覧を列挙します。

private void EnumerateAddressListsForStore()
        {
            Outlook.Folder currentFolder =
                Application.ActiveExplorer().CurrentFolder
                as Outlook.Folder;
            Outlook.Store currentStore = currentFolder.Store;
            List<Outlook.AddressList> addrListsForStore = 
                GetAddressLists(currentStore);
            foreach (Outlook.AddressList addrList in addrListsForStore)
            {
                Debug.WriteLine(addrList.Name 
                    + " " + addrList.AddressListType.ToString()
                    + " Resolution Order: " +
                    addrList.ResolutionOrder);
            }
        }

        public List<Outlook.AddressList> GetAddressLists(Outlook.Store store)
        {
            List<Outlook.AddressList> addrLists = 
                new List<Microsoft.Office.Interop.Outlook.AddressList>();
            string PR_EMSMDB_SECTION_UID =
                @"https://schemas.microsoft.com/mapi/proptag/0x3D150102";
            if (store == null)
            {
                throw new ArgumentNullException();
            }
            Outlook.PropertyAccessor oPAStore = store.PropertyAccessor;
            string storeUID = oPAStore.BinaryToString(
                oPAStore.GetProperty(PR_EMSMDB_SECTION_UID));
            foreach (Outlook.AddressList addrList
                in Application.Session.AddressLists)
            {
                Outlook.PropertyAccessor oPAAddrList =
                    addrList.PropertyAccessor;
                string addrListUID = oPAAddrList.BinaryToString(
                    oPAAddrList.GetProperty(PR_EMSMDB_SECTION_UID));
                // Return addrList if match on storeUID
                // and type is olExchangeGlobalAddressList.
                if (addrListUID == storeUID)
                {
                    addrLists.Add(addrList);
                }
            }
            return addrLists;
        }

まとめ

Outlook 2010 には、開発者が意欲的に取り組める課題が用意されています。ソリューションの UI を強化して、Outlook 2010 の新しい UI とシームレスに統合できます。ソリューションで情報の格納にカスタム フォルダーを使用している場合は、新しいソリューション モジュールとカスタム フォルダー アイコンを使用して、フォルダーを見つけやすくすることができます。コードを記述するときは、複数の Exchange アカウントに対応できるようにすると共に、スレッド ビューやアイテムの選択など、Outlook 2010 の強力な新機能のためにオブジェクト モデルに加えられた変更を活用できるようにする必要があります。最後に、32 ビット版と 64 ビット版の Outlook のサポートなど、プラットフォームに変更が加えられたことで、特に MAPI レベルで記述された高度なアプリケーションでは、変化と複雑さがさらに増すことになります。

その他の技術情報

MAPI

Welcome to the Outlook 2010 MAPI Reference

Outlook 2010: MAPI Header Files (英語)

Outlook 2010 Messaging API (MAPI) Code Samples (英語)

SGriffin's MAPI Internals (英語)

Office Fluent UI の拡張性

Office 2010 のコンテキスト メニューのカスタマイズ

Office 2010 の Backstage ビューについて (開発者向け)

Office 2010 のリボンの拡張性 : タブのアクティブ化と自動サイズ調整

Microsoft Office 2010 Fluent UI Schema (英語)

Microsoft Office 2010 Fluent User Interface Control Identifiers (英語)