はじめに
ExcelVBAでOutlookを使ってメール送信した内容を取り出すプログラムに挑戦してみます。
最終的には、メールの整理(迷惑メールの削除など)に展開できればと考えています。
今回は準備としてメールフォルダにアクセスして受信したメールの題名等を表示するまでを紹介します。
まず、メール送信した時と同じようにOutlookを扱うためのライブラリをVBEの参照設定でチェックしておきます。
やり方についてはこちらを参照してください。
Outlookの機能にアクセスするMAPI
Outlookからのメール送信はメール送信に比べて少々厄介です。
具体的には、MAPIというオブジェクトを使ってOutlookの機能にアクセスする形にになります。
MAPIというのは、マイクロソフト社が考えたプログラム同士の標準的な呼び出し規約(API)の1つだそうです。
(正直、良くわからなくてもブラックボックス的に使用すれば問題ありません。)
今回はテストプログラムを書いて、ブレークポイントで停止させてVBEのローカルウインドウに内部構造を表示させてプログラミングに活かしていこうと思います。
テストコード
Sub getMailTest1()
Dim myNamespace As Outlook.Namespace
Set myNamespace = Outlook.Application.GetNamespace("MAPI")
Dim myFolder As Outlook.Folder
'受信トレイ下の受信アーカイブ
Set myFolder = myNamespace.GetDefaultFolder(olFolderInbox)
Debug.Print myFolder.Items.Count
Stop
End Sub
まず、Outlook.Application.GetNamespace(“MAPI”)でNamespaceを取得できます。これは、メールアイテムの集合体と考えて良いでしょう。「受信トレイ」や「送信トレイ」、「下書き」、「迷惑メール」などのフォルダを含んでいます。
次の myNamespace.GetDefaultFolder(olFolderInbox) ですが、先程のNamespaceから特定のフォルダを取得することができます。
olFolderInboxは「受信トレイ」になります。
実行するとVBEのローカルウインドウには以下のようになりました。最初は myNamespace (MAPI)です。

次に、myFolder (受信トレイ)です。

MAPIの内部構造を見てみる
細かく色々と並んでいるので、整理したのが以下のリストです。
namespace (MAPI)
….
+ Folders
….
Item 1 (1つ目のメールアカウント)
Name (アカウント名)
+ Folders
….
Item 1 (削除済みアイテムフォルダー)
Item 2 (受信トレイフォルダー) ★
Name (”受信トレイ”)
+ Items (受信したメール)
Item 1 (メール1)
Item 2 (メール2)
Item 3 (メール3)
….
Item 2 (2つ目のメールアカウント)
….
Name (アカウント名)
Item 1 (削除済みアイテムフォルダー)
Item 2 (受信トレイフォルダー)
….
olFolderInbox (「受信トレイ」フォルダー) ★
Name (”受信トレイ”)
+ Items (受信したメール)
Item 1 (メール1)
Item 2 (メール2)
Item 3 (メール3)
….
★印のフォルダが同じ場所になります。つまりNamespaceを取得して、 GetDefaultFolder(olFolderInbox) とすれば、一気に「受信トレイ」フォルダまで取得できるという事になります。あとは、Itemsにアクセスすれば個々のメールを参照する事ができます。
Sub getMailFolder()
Dim myNamespace As Outlook.Namespace
Set myNamespace = Outlook.Application.GetNamespace("MAPI")
Dim myFolder As Outlook.Folder
Set myFolder = myNamespace.GetDefaultFolder(olFolderInbox)
With myFolder
Dim i As Long
Dim olItem As Outlook.MailItem
'.Items.Countでメールの数を取得しますが取り敢えず10個だけ表示
For i = 1 To 10
Set olItem = .Items(i)
Cells(i, 1) = i
Cells(i, 2) = olItem.ReceivedTime '受信日時
Cells(i, 3) = olItem.subject '題名
Cells(i, 4) = olItem.SenderName '送信者名
Cells(i, 5) = olItem.SenderEmailAddress '送信メールアドレス
Cells(i, 6) = Left(olItem.Body, 20) '本文(先頭から20文字)
Next
End With
End Sub
「受信トレイ」フォルダのItemsは受信メールの配列になります。Items(1)が新しいメールになります。
メールの数は、Items.Count で取得できます。今回はテストなので10個だけ表示させています。
フォルダの取得方法
上記の例では、単に「受信トレイ」フォルダーと説明してきましたが、アカウントが2つ以上ある場合は、1つ目のアカウントの「受信トレイ」フォルダーとなります。
GetDefaultFolder(olFolderInbox) では、2つ目のアカウントの「受信トレイ」フォルダーを取得する事はできません。
ちなみに、アカウントの既定値を入替えたりしても最初に登録したアカウントが GetDefaultFolder関数の対象となっていると思われます。
ところでフォルダーを取得する方法は、GetDefaultFolder以外にもNamespaceから順番に辿って行く方法もあります。
以下のプログラムは、受信トレイの名前とアイテム(メール)の数を表示します。
Sub getMailTest2()
Dim myNamespace As Outlook.Namespace
Set myNamespace = Outlook.Application.GetNamespace("MAPI")
Dim myFolder As Outlook.Folder
'受信トレイ GetDefaultFolder(olFolderInbox)
Set myFolder = myNamespace.GetDefaultFolder(olFolderInbox)
Debug.Print myFolder.Name
Debug.Print myFolder.Items.Count
Stop
'受信トレイ Foldersを辿る方法
Set myFolder = myNamespace.Folders(1).Folders("受信トレイ")
Debug.Print myFolder.Name
Debug.Print myFolder.Items.Count
Stop
End Sub
myNamespace.Folders(1)は、1つ目のアカウントになるので、2つ目のアカウントの「受信トレイ」フォルダを選択したい場合はカッコ内を 2 にセットすればOKです。
サブフォルダーを取得する
今度は、「受信トレイ」下に「受信アーカイブ」というサブフォルダーを作ってそこにアクセスしてみます。

「受信トレイ」下の「受信アーカイブ」は、「受信トレイ」を右クリックして「フォルダーの作成」で作ることができます。
サブフォルダーは、以下のような形で取得する事ができます。
親フォルダー.Folders(“サブフォルダー名”)
括弧内は数値がわかっていれば数値で指定してもOKです。
Sub getMailTest3()
Dim myNamespace As Outlook.Namespace
Set myNamespace = Outlook.Application.GetNamespace("MAPI")
Dim myFolder As Outlook.Folder
'受信トレイ
Set myFolder = myNamespace.GetDefaultFolder(olFolderInbox)
Debug.Print myFolder.Name
Debug.Print myFolder.Items.Count
'受信トレイ下の受信アーカイブ
Set myFolder = myNamespace.GetDefaultFolder(olFolderInbox).Folders("受信アーカイブ")
Debug.Print myFolder.Name
Debug.Print myFolder.Items.Count
Stop
End Sub
まとめ
今回はOutlookでメール受信するための準備として、Namespace(MAPI)から「受信トレイ」フォルダを選択する方法を中心に紹介しました。
「受信トレイ」フォルダを取得できたら、getMailFolder()に示したようにItemsにある個々のメールにアクセスできます。
次回は、新たにサブフォルダを作りアクセスできるようになったので、メールを移動したり、削除したりする方法を見ていきたいと思います。