メイン画像

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

アカウントを作成 して、もっと沢山の記事を読みませんか?


この記事が気に入ったら ことりと さんを応援しませんか?
メッセージを添えてチップを送ることができます。


この記事にコメントをしてみませんか?


酒とアクアリウムが最近の楽しみ。

おすすめの記事