スクリプトは以下の環境で実行している。
Outlook オブジェクトの生成
以下のコードのように Outlook もこの関数でオブジェクトを作成できる。
Dim vOutlookApp Set vOutlookApp = CreateObject("Outlook.Application")
Outlook が起動されていない場合
CreateObject関数により Outlook が起動する。
が、タスクバーのアイコンに次のような警告が表示される。
「Outlook が他のプログラムによって使用されています。プログラムとの接続を切断して Outlook を終了するには、 Outlook アイコンをクリックして、[今すぐ終了]をクリックしてください。」

一応、この状態でもスクリプトからの利用はできるが、なんか気持ち悪い。
Outlook が起動されている場合
結論
CreateObject関数ではなく、以下のようにGetObject関数を使って Outlook オブジェクトを取得する。
On Error Resume Next 'Outlook オブジェクトを取得する Dim vOutlookApp Set vOutlookApp = GetObject(, "Outlook.Application") '取得できなければエラー If Err.Number <> 0 Then WScript.Echo "Outlook オブジェクトが取得できませんでした。" & vbLf & "Outlook を起動してください。" _ & vbLf & vbLf _ & "Error # " & CStr(Err.Number) & " was generated by " _ & Err.Source & vbLf & " " & Err.Description WScript.Quit 1 End If On Error GoTo 0
余談。起動されていたらそれを、されていなければ起動するようにするには
Outlook が起動されていたらその Outlook オブジェクトを使い、起動されていなければ新しく起動するようにするには、GetObject関数とCreateObject関数を組み合わせて使えばよい。
'Outlook オブジェクトを生成したかどうか Dim vIsCreatedOutlook vIsCreatedOutlook = False On Error Resume Next 'Outlook オブジェクトを取得する Dim vOutlookApp Set vOutlookApp = GetObject(, "Outlook.Application") '取得失敗。新しく作る(Outlook を起動する) If Err.Number <> 0 Then Err.Clear Set vOutlookApp = CreateObject("Outlook.Application") If Err.Number = 0 Then vIsCreatedOutlook = True Else WScript.Echo "Outlook オブジェクトが取得できませんでした。" & vbLf & "Outlook を起動してください。" _ & vbLf & vbLf _ & "Error # " & CStr(Err.Number) & " was generated by " _ & Err.Source & vbLf & " " & Err.Description WScript.Quit 1 End If End If On Error GoTo 0
オブジェクトを使い終わったら参照を切る。
新しく Outlook を起動したときだけQuitも実行するようにしておけば良いだろう。
'CreateObject したときだけ Quit も実行する If vIsCreatedOutlook Then vOutlookApp.Quit End If Set vOutlookApp = Nothing
メール内容(メッセージファイル)の読み取り
Outlook メッセージファイル(.msg)を読み取るには、 NameSpace オブジェクトのOpenSharedItemメソッドを使う。
まず Outlook オブジェクトのGetNamespace("MAPI")メソッドを使い、 NameSpace オブジェクトを取得する。
Dim vOutlookNameSpace Set vOutlookNameSpace = vOutlookApp.GetNamespace("MAPI")
次に NameSpace オブジェクトのOpenSharedItemメソッドを使いアイテムを取得する。
引数には Outlook メッセージファイルのパスを指定する。
Dim vMailItem Set vMailItem = vOutlookNameSpace.OpenSharedItem("C:\path\to\outlook-msg-file.msg")
取得したアイテムからメールの内容が参照できる。
たとえば、以下のようなプロパティがある。
| プロパティ | 説明 | 読み取り専用 |
|---|---|---|
| SenderEmailAddress | 送信者のメールアドレス | ○ |
| ReceivedTime | 受信日時 | ○ |
| To | 宛先の表示名 | |
| CC | CC の表示名 | |
| BCC | BCC の表示名 | |
| Body | メール本文 | |
| Attachments | 添付ファイル | ○ |
*To、CC、BCC はメールアドレスではなく表示名である。
使い終わったらCloseメソッドでアイテムを閉じる。
Closeメソッドの引数は保存モードを表す。この例にある1はアイテムを保存しない(変更内容を破棄)を意味する。
アイテムを閉じたら参照を切る(変数にNothingを格納する)のを忘れないように。
vMailItem.Close 1 Set vMailItem = Nothing
コードサンプル
以下の例は、メールアイテムから受信日時を取得し、メッセージボックスで表示するコードである。
なお、Outlook 、 NameSpace 、 MailItem の各オブジェクトは変数に入れず、Withで参照するように作ってある。
このようにすると実行時エラーが起きても確実に解放することができる。
Option Explicit With GetObject(, "Outlook.Application") With .GetNamespace("MAPI") With .OpenSharedItem("C:\path\to\outlook-msg-file.msg") MsgBox .ReceivedTime .Close 1 End With End With End With