FlushMailメソッドを使ったコード
それでは、先ほどの[リスト01] (mail.vbs)をFlushMailメソッドを使って書き換えてみましょう。
[リスト02] mail2.vbs
' スクリプトの動作に必要な設定情報
Const ADDRESS_LIST = "C:\tmp\mail\mail_to.dat" ' 配信リストのパス
Const MAIL_BODY = "C:\tmp\mail\mail_body.dat" ' メール本文のパス
Const QUEUE = "c:\tmp\mail\queue" ' キューのパス(1)
Const SMTP = "&smtp.examples.com" ' SMTPサーバのホスト名
Const FROM = "WINGS News <CQW15204@nifty.com>" ' 送信元アドレス
Const SUBJECT = "【WINGS News】「JavaScriptマスターブック」好評発売中" ' 件名
Const FILES = "" ' 添付ファイルのパス
Set fs = WScript.CreateObject("Scripting.FileSystemObject")
' Basp21オブジェクトを生成
Set basp = WScript.CreateObject("Basp21")
' メール本文をまとめて読み込み、変数tmp_bodyに格納
tmp_body = fs.OpenTextFile(MAIL_BODY, 1, False).ReadAll()
' 配信リストを読み込み、順番に処理
Set stream_list = fs.OpenTextFile(ADDRESS_LIST, 1, False)
Do While Not stream_list.AtEndOfStream
' 読み込んだ行をタブで分割し、配列lineに格納
line = Split(stream_list.ReadLine(), Chr(9))
' 宛先アドレスをセット
to_address = line(0)
' 本文をセット(#TO_NAME#を宛先名で置換)
body = Replace(tmp_body, "#TO_NAME#", line(1))
' 設定内容に従って、メールをキューに追加(2)
result = basp.SendMail(QUEUE, to_address, FROM, SUBJECT, body, FILES)
Loop
stream_list.Close()
' キューに含まれるメールを一斉送信(3)
count = basp.FlushMail(SMTP, QUEUE)
' 結果に応じてエラー処理(4)
If count > 0 Then
WScript.Echo(count & "通のメール送信処理を完了しました。")
Else
WScript.Echo("メール送信処理中にエラーが発生しました。")
End If
ここでのポイントは4点です。
(1)キューフォルダのパスを決定する
先述したように、キューフォルダは自由な場所に設定できます。本稿のサンプルでは、「c:\tmp\mail\queue」フォルダとしていますが、自分の環境に応じて変更しても構いません。sent、errフォルダについては名前も固定で、位置もキューフォルダの配下に配置する必要がありますので、スクリプト側では特にパスを明示する必要はありません。
(2)キューにメールを格納するのはSendMailメソッド
FlushMailメソッドは、実はSendMailメソッドと抱き合わせで利用する必要があります。というのも、FlushMailメソッドの役割はキューからメールを送信するだけで、メールデータを作成し、キューに追加するのはSendMailメソッドの役割であるからです。 キューにメールを格納したい場合、SendMailメソッドの第一引数にホスト名の代わりに、キューフォルダのパスを指定します。これによって、メールは送信されずにただキューに保存されます。
(3)キューからメールを送信するFlushMailメソッド
FlushMailメソッドの構文は、以下の通りです。
[構文]FlushMailメソッド
Basp21オブジェクト.FlushMail(SMTPサーバ名, キューフォルダ)
SMTPサーバ名の指定方法はSendMailメソッドとほぼ同じですが、唯一、先頭に「&」指定をできる点が異なります。「&」が付けられた場合、FlushMailメソッドは非同期モードでメールの送信を行います。
(4)FlushMailメソッドの戻り値を判定する
FlushMailメソッドは、メールの送信処理に成功した場合には送信したメールの件数を返します。エラーが発生した場合には、エラーコードを表す負の整数値を返します(エラーコードの意味については、公式ドキュメントを参照してください)。
ただし、非同期モードでメールを送信した場合には、正数が返されたからと言って、必ずしもメールの送信が成功したとは限りません(その時点ではまだ送信処理は完了していないからです)。最終的な成否は、errフォルダの内容を確認するようにしてください。以上を理解したら、mail2.vbsをダブルクリックして、スクリプトを実行してください。送信完了の後、メールが正しく宛先に届いていること、sentフォルダにメールデータが格納されていることを確認してみましょう。
まとめ
以上、今回はBasp21コンポーネントを使ったメール送信の方法について紹介しました。Basp21はメール送信機能で有名になったコンポーネントですが、(冒頭述べたように)それが機能のすべてではありません。本稿で興味を持った方は、是非、他のさまざまな機能についても、本家ドキュメントを見ながら実際に試してみると良いでしょう。この連載でもまた機会を見つけて、その他の主要な機能についても紹介できればと思っています。
山田祥寛
有限会社WINGSプロジェクト代表取締役。Microsoft MVP for ASP/ASP.NET。主な近著に「JavaScriptマスターブック」「ASP.NET AJAXプログラミング」「MySQL逆引きクイックリファレンス」(毎日 コミュニケーションズ)、「独習Java サーバサイド編」「Zend Framework徹底入門」(翔泳社)、「ASP.NET MVC実践プログラミング」(秀和システム)、「書き込み式 SQLのドリル」(ソシム)など。最近では、雑誌/サイト記事の執筆/監修から講演までを広く手掛ける毎日である。 http://www.wings.msn.to/