Outlookオブジェクトを利用してVBScriptでメールを送信する方法

Outlookでメールの受送信をしている環境下でVBScriptでメールを送信するプログラムを覚え書き。

Outlookがインストールされており、アカウントの設定もされていてメールの送受信ができているPC上で動作するVBScriptになります。

添付ファイルの指定や署名の追加する方法についても記載しています。

最終的なサンプルプログラムでは、メールの件名、内容をテキストファイルに記述してテキストファイルの内容をメールで送信するプログラムを掲載しています。

メール送信をするVBScriptの基本的な例

まずは基本的なメール送信プログラムです。

'Outlookオブジェクトの変数宣言
Dim olObj
Set olObj = CreateObject("Outlook.Application")

'メール送信用のオブジェクト作成
Dim mailObj
Set mailObj = olObj.CreateItem(olMailItem)

'メール送信内容の作成
	With mailObj
    	.To = "admin@selifelog.com" '宛先
    	.CC = "admin@selifelog.com" 'CCに指定する宛先、不要なら行ごと削除
    	.BCC = "admin@selifelog.com" 'BCCに指定する宛先、不要なら行ごと削除
    	.Subject = "テストメール"    'メールの件名
    	.Body = "お疲れさまです。" 'メールの本文
    	.BodyFormat = 1     'メールの形式(1:テキスト形式)
	End With
  
'メール送信
mailObj.Send

メール本文を指定する際の補足

メール本文に改行された複数行の文章を指定したい場合は、改行コードを表す「chr(13) + chr(10)」をつけて指定します。
例えば、

「お疲れさまです。
   山田です。
   本日体調不良のためお休みいたします。」

というような文章を送信したい場合に「Body」部分の記載は以下のようになります。

.Body = "お疲れさまです。"+ chr(13) + chr(10) + "山田です。" _
        + chr(13) + chr(10) + "本日体調不良のためお休みいたします。"

複数行にわたる文章は、スクリプトの中で直接記述するのは少し面倒で分かりづらいです。

後ほど紹介しますが、メール本文はテキストファイルで用意してそのテキストファイルからメール本文を読み込んで指定するサンプルプログラムを記載しますので参考にしてください。

BodyFormatに関する補足

BodyFormat」は、メール本文のテキスト形式に関するオプションです。

Outlookの操作でいうと、メール作成画面の[書式設定]メニューで指定する形式です。

指定できるテキスト形式と各形式を示す値を以下の表にまとめました。

VBScriptでは、名前付き引数として指定はできないので、各形式に対応する値を指定してください。

フォーマット形式 名前
指定なし olFormatUnspecified 0
テキスト形式 olFormatPlain 1
HTML 形式 olFormatHTML 2
リッチ テキスト形式 olFormatRichText 3

詳細は以下のMicrosoftのページを参照

ファイルを添付してメールを送信するVBScript

送信するメールにファイルを添付する場合は、「Attachments.Add」に添付するファイルのフルパスを指定して添付します。

mailObj.Attachments.Add(“C:\temp\添付ファイル01.txt")

添付ファイルが複数ある場合は、添付したいファイルの数だけ「Attachments.Add」を繰り返します。

mailObj.Attachments.Add(“C:\temp\添付ファイル01.txt")
mailObj.Attachments.Add(“C:\temp\添付ファイル02.txt")

先程紹介したメール送信のプログラムと組み合わせるとこんな感じです。

'Outlookオブジェクトの変数宣言
Dim olObj
Set olObj = CreateObject("Outlook.Application")

'メール送信用のオブジェクト作成
Dim mailObj
Set mailObj = olObj.CreateItem(olMailItem)

'メール送信内容の作成
	With mailObj
    	.To = "admin@selifelog.com" '宛先
    	.CC = "admin@selifelog.com" 'CCに指定する宛先、不要なら行ごと削除
    	.BCC = "admin@selifelog.com" 'BCCに指定する宛先、不要なら行ごと削除
    	.Subject = strTitle    'メールの件名
    	.Body = strBody 'メールの本文
    	.BodyFormat = 1     'メールの形式(1:テキスト形式)
	End With
	
	mailObj.Attachments.Add("C:&yentemp&yen添付ファイル01.txt")
	mailObj.Attachments.Add("C:&yentemp&yen添付ファイル02.txt")
	
'メール送信
mailObj.Send

「Attachments.Add」の追加場所は、メール送信用のオブジェクト「mailObj]が作成された後からメールを送信する「Send」までの間であればどこでも構いません。

署名を追加してメールを送信するVBScript

Outlookで署名を設定している場合、その署名の情報は以下のフォルダにメールのフォーマット形式ごとに署名の名前をファイル名として保管されています。

C:\Users\ユーザー名\AppData\Roaming\Microsoft\Signatures

署名ファイルが「署名.txt」というファイル名で保存されていることを前提として、署名をメールの本文に追加する場合、テキストファイルから内容を読み込む必要があります。

ファイルの読み込みには「FileSystemObject」を新たに使用します。

'Outlookオブジェクトの変数宣言
Dim olObj
Set olObj = CreateObject("Outlook.Application")

'メール送信用のオブジェクト作成
Dim mailObj
Set mailObj = olObj.CreateItem(olMailItem)

'署名ファイルの内容を読み込むためのFileSystemObjectの作成
Dim FSO
Set FSO = CreateObject("Scripting.FileSystemObject")

'署名ファイルの内容を読み込むTextStreamオブジェクトの作成
Dim ObjSig
Set ObjSig = FSO.GetFile("C:&yenUsers&yenユーザー名&yenAppData&yenRoaming&yenMicrosoft&yenSignatures&yen署名.txt").OpenAsTextStream(1, -2)

'メール送信内容の作成
	With mailObj
    	.To = "admin@selifelog.com" '宛先
    	.CC = "admin@selifelog.com" 'CCに指定する宛先、不要なら行ごと削除
    	.BCC = "admin@selifelog.com" 'BCCに指定する宛先、不要なら行ごと削除
    	.Subject = "テストメール"    'メールの件名
    	.Body = "お疲れさまです。" + chr(13) + chr(10) + ObjSig.ReadAll 'メールの本文
    	.BodyFormat = 1     'メールの形式(1:テキスト形式)
	End With

ObjSig.Close

'メール送信
mailObj.Send

.OpenAsTextStream(1, -2)」の引数に指定している値は、「iomode」と「format」を示す値です。

このプログラムでは、署名が記載されたテキストファイルから読み込むだけなので、「iomode」は、「ForReading」を表す"1″、「format」は、システムの既定の設定でファイルを開く「TristateUseDefault」を表す“-2"を指定しています。

.OpenAsTextStream(1, -2)」の詳細については、Microsoftの以下のページを参照してください。

メールの本文にテキストファイルの内容を指定するVBScript

先にも説明しましたが、メールを送信するVBScriptのプログラム中で複数行の文面を直接記載するのはとても面倒です。

そこで、プログラム中に直接記載するのでなく、テキストファイルにメールの本文を記載して、プログラムからそれを読み込んでメールの本文にするサンプルプログラムを以下に記載します。

基本的には署名をメール本文に追加するのと同じ方式です。

このプログラムでは、実行されるVBScriptと同じフォルダにメールの本文が記載されたテキストファイル「mail.txt」が保管されているという前提です。

'Outlookオブジェクトの変数宣言
Dim olObj
Set olObj = CreateObject("Outlook.Application")

'メール送信用のオブジェクト作成
Dim mailObj
Set mailObj = olObj.CreateItem(olMailItem)

'メール本文ファイルの内容を読み込むためのFileSystemObjectの作成
Dim FSO
Set FSO = CreateObject("Scripting.FileSystemObject")

'メール本文ファイルの内容を読み込むTextStreamオブジェクトの作成
Dim ObjSig
Set ObjSig = FSO.GetFile("mail.txt").OpenAsTextStream(1, -2)

'メール送信内容の作成
	With mailObj
    	.To = "admin@selifelog.com" '宛先
    	.CC = "admin@selifelog.com" 'CCに指定する宛先、不要なら行ごと削除
    	.BCC = "admin@selifelog.com" 'BCCに指定する宛先、不要なら行ごと削除
    	.Subject = "テストメール"    'メールの件名
    	.Body = ObjSig.ReadAll 'メールの本文をファイルから読み込んでセットする
    	.BodyFormat = 1     'メールの形式(1:テキスト形式)
	End With

ObjSig.Close

'メール送信
mailObj.Send

スクリプトとは別の場所にテキストファイルが保管されている場合は、"mail.txt"をフルパスで記載してください。

メールの件名もテキストファイルに含める

メール本文が書かれたテキストファイルの1行目をメールの件名に設定して、2行目以降をメール本文にするサンプルプログラムを参考までに記載しておきます。

'メールの件名と本文をテキストファイルから読み込む
Dim strFileName
strFileName = "mail.txt"

Dim FSO
Set FSO = WScript.CreateObject("Scripting.FileSystemObject")

Dim OpenFile
Set OpenFile = FSO.OpenTextFile(strFileName, 1, False, 0)

Dim TextLine , i
  i = 0
  Do Until OpenFile.AtEndOfStream
    TextLine = OpenFile.ReadLine
      if i = 0 then
        strTitle = TextLine
      else
        if i =1 then
          strBody =TextLine
        else
          strBody =strBody + chr(13) + chr(10) + TextLine
        end if
      end if

    i = i + 1
  Loop

OpenFile.Close

'Outlookオブジェクトの変数宣言
Dim olObj
Set olObj = CreateObject("Outlook.Application")

'メール送信用のオブジェクト作成
Dim mailObj
Set mailObj = olObj.CreateItem(olMailItem)

'メール送信内容の作成
Dim strTitle , strBody
	With mailObj
    	.To = "admin@selifelog.com" '宛先
    	.CC = "admin@selifelog.com" 'CCに指定する宛先、不要なら行ごと削除
    	.BCC = "admin@selifelog.com" 'BCCに指定する宛先、不要なら行ごと削除
    	.Subject = strTitle    'メール件名
    	.Body = strBody 'メール本文
    	.BodyFormat = 1     'メールの形式(1:テキスト形式)
	End With

'メール送信
mailObj.Send

1行目が件名となっているためテキストファイルの内容全部を「.ReadAll」で指定することができなません。

そのため、テキストファイルから1行ずつ読み込み、1行目をメールの件名を表す変数「strTitle」にセットし、2行目以降をメール本文を表す変数「strBody」にセットしています。

メール本文については、1行読み込むごとにCRLF(改行)を付加しています。

テキストファイルの最後に署名を記載しておけば署名がついた形で送信できます。

まとめ

Outlookオブジェクトを使用してVBScriptでメールを送信するサンプルプログラムについて記載しました。

VBAを使ったサンプルはインターネット上にたくさんありますが、VBAだとExcelが起動していないとだめなのでVBScriptで作ってみました。

VBScriptならWindowsのタスクなどから日時指定で出せたりしますし、より汎用的に使えるのではないかと思います。

最後まで記事を読んでいただいてありがとうございました。