Hey, Scripting Guy!

Scripting Guys が皆さんの質問にお答えします

TechNet コラムへようこそ。このコラムでは、よく寄せられるシステム管理スクリプトに関する質問に Scripting Guys がお答えします。システム管理スクリプトについて質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。

詳細情報

Hey, Scripting Guy! カテゴリ別アーカイブ

Hey, Scripting Guy! 日付別アーカイブ

Hey, Scripting Guy! ダウンロード (英語)

Outlook 受信トレイのサブフォルダではないメール フォルダにアクセスする方法はありますか

 

Scripting Guy さん、よろしくお願いします。受信トレイのサブフォルダではない、Outlook メールボックスの指定したメール フォルダにアクセスする方法はありますか。

-- RT

RT さん、こんにちは。ご存知のように、前回のおもしろいコラム...え、何ですって。このコラムでおもしろかった回など "1 つも" ないですって。とんでもない、このコラムはスクリプト界の世界最速コースター Kingda Ka と言われている "Hey, Scripting Guy!" ですよ。以前、皆さんにご説明した 1 つのファイルのコピーを 150 個作成する方法を覚えていますか。わかっています。"その" コラムは皆さんの興味をそそらなかったのですね。

ええ、そのとおりです。では、あのコラムはどうです。いや、考えてみればあの回もそれほどおもしろいものではなかったですね。でも、あのコラムがありました。いや、やめておきます。役には立ちましたが、少しもわくわくするものではありませんでした。その他のコラムも振り返ってみましょう。テキスト ファイルの各行頭にゼロを追加する方法Windows XP コンピュータでローカル ユーザー アカウントの名前を変更する方法テキスト ファイル内の単語数をカウントする方法などがありました。そうですね、たぶん皆さんのおっしゃるとおりです。最初からやり直しましょう。

RT さん、こんにちは。ご存知のように、決しておもしろいとは言えない前回のコラムで、受信トレイのサブフォルダではない Microsoft Outlook フォルダにアクセスする方法を紹介することをお約束しました。その意味を理解するため、次の Outlook フォルダの構成を考えます。


ご覧のように、メールボックスには Art Submissions、Blogs、Europe、Fixes Required など、多くの電子メール フォルダがあります。また、これらのフォルダはどれも受信トレイのサブフォルダではありません。実際、このすばらしい Outlook フォルダの構造では、すべて "受信トレイ" フォルダと同じレベルに位置しています。これはすばらしいことですが、1 つだけ問題があります。どうやって受信トレイのサブフォルダではないフォルダにアクセスするのでしょうか。

その方法は次のとおりです。

Visual Basic
Const olFolderInbox = 6 
 
Set objOutlook = CreateObject("Outlook.Application") 
Set objNamespace = objOutlook.GetNamespace("MAPI") 
Set objInbox = objNamespace.GetDefaultFolder(olFolderInbox) 
 
strFolderName = objInbox.Parent 
 
Set objMailbox = objNamespace.Folders(strFolderName) 
 
Set objFolder = objMailbox.Folders("Europe") 
 
Set colItems = objFolder.Items 
 
For Each objItem in colItems 
    Wscript.Echo objItem.Subject 
Next
 

確かに、これが "おもしろい" コラムであれば、このスクリプトがどのように機能するかを読者自身に解明していただいて、スリルと興奮を味わっていただけるでしょう。しかし、このコラムは "少しも" おもしろくないので、先へ進んで代わりにすべてご説明します。

まず、olFolderInbox という名前の定数を定義して、その値を 6 に設定します。ここで慌てないでください。受信トレイや受信トレイのサブフォルダに関心がないことはわかっています。この定数が必要である理由をすぐに説明します。

定数を定義したら、Outlook.Application オブジェクトのインスタンスを作成し、GetNamespace メソッドを使用して、MAPI 名前空間 (バインドできる唯一の名前空間) にバインドします。その後、次のコード行を使用して、"受信トレイ" フォルダにバインドします。

Visual Basic
Set objInbox = objNamespace.GetDefaultFolder(olFolderInbox)
 

いいえ、忘れていませんよ。最初に受信トレイにバインドする理由があります。このスクリプトでは、Europe フォルダから情報を取得しようとしています。このフォルダは "メールボックス - Ken Myer" フォルダのサブフォルダです。Europe フォルダに到達するには、まず "メールボックス - Ken Myer" にバインドする必要があります。このバインドが完了した後でないと、Europe フォルダにバインドできません。フォルダ構造内の移動は、一度で 1 つのレベルを処理する必要があります。

それでは、なぜ最初に "受信トレイ" フォルダに接続するのでしょうか。そうですね、この場合、メールボックス フォルダの名前が "メールボックス - Ken Myer" であることがわかっています。すばらしいですね。しかし、このスクリプトを他の人と共有するとします。その場合、その人たちのメールボックスも "メールボックス - Ken Myer" である可能性はかなり低いでしょう。ここで目指しているのは、コードの中にメールボックスの名前をハードコーディングすることなく、"すべての" メールボックス フォルダに接続できるスクリプトを開発することです。

これでおわかりいただけたでしょうか。ここでの唯一の問題は、メールボックスの名前を直接取得する方法がわからないことです (そのような方法がないと言っているのではありません。単にわからないのです)。ただし、受信トレイにバインドして Parent プロパティの値を取得することで、メールボックスの名前を取得できることはわかっています。受信トレイはメールボックスの子フォルダであるため、受信トレイの親はなんと、メールボックスです。これを行うのが次のコード行です。

Visual Basic
strFolderName = objInbox.Parent
 

変数 strFolderName 内に格納するメールボックスの名前がわかれば、次のコード行を使用してメールボックス フォルダへのオブジェクト参照を作成できます。

Visual Basic
Set objMailbox = objNamespace.Folders(strFolderName)
 

努力した甲斐は、きっとあったに違いないです。最終的に、メールボックスに接続すると、そのメールボックス フォルダ内にあるすべてのサブフォルダにバインドできます。Europe フォルダに接続するには、次のスクリプトを実行します。

Visual Basic
Set objFolder = objMailbox.Folders("Europe")
 

しくみがわかりましたか。メールボックスの Folders コレクションを参照して、接続するフォルダ名 (Europe) を指定するだけです。その結果、Europe フォルダを指すオブジェクト参照 (objFolder) が作成されます。

ここからは簡単です。Europe フォルダのすべてのアイテム (電子メール メッセージ) のコレクションを取得するには、次のコード行を使用します。

Visual Basic
Set colItems = objFolder.Items
 

あとは、コレクションのすべての項目を処理する For Each ループを設定するだけです。このコレクションを取得すると、だいたいどのような操作でも可能ですが、この簡単なサンプル スクリプトでは、各メッセージの件名をエコー バックします。

たとえばどんな操作があるでしょうか。皆さんは Scripting Guys のことをよくご存知ですよね。私たちの提案はありふれたつまらないものです。皆さんなら、おそらくもっとわくわくすることを思い付くでしょう。では、失礼して、暖かいミルクを 1 杯飲んで、ちょっと昼寝してきます。あまり興奮したくありませんから。


ページのトップへ