VBScript から Outlook を操作する
VBScript から Outlook を操作する
VBScript から Outlook を扱う方法を整理する。
スクリプトは以下の環境で実行している。
- Windows 10 Pro 21H2
- Outlook 2016
Outlook オブジェクトの生成
VBScript ではCreateObject
関数を使って、 ActiveX オブジェクトを作成できる。
以下のコードのように Outlook もこの関数でオブジェクトを作成できる。
Dim vOutlookApp
Set vOutlookApp = CreateObject("Outlook.Application")
ただし、スクリプトの実行時に Outlook が起動されているか、いないか、によって動きが異なる。
Outlook が起動されていない場合
CreateObject
関数により Outlook が起動する。
が、タスクバーのアイコンに次のような警告が表示される。
「Outlook が他のプログラムによって使用されています。プログラムとの接続を切断して Outlook を終了するには、 Outlook アイコンをクリックして、[今すぐ終了]をクリックしてください。」
一応、この状態でもスクリプトからの利用はできるが、なんか気持ち悪い。
Outlook が起動されている場合
新しい Outlook は起動されない。
替わりに、起動済みの Outlook が取得される。
(CreateObject なのに……)
なので、取得した Outlook に対してスクリプト内でQuit
を実行していると、起動済みの 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
アカウントを作成 して、もっと沢山の記事を読みませんか?
この記事にコメントをしてみませんか?