Windows TIPS
[Scripting]
  Windows TIPS TOPへ
Windows TIPS全リストへ
内容別分類一覧へ

テンプレートを元に複数のメールを一括配信する

解説をスキップして作業手順を読む

山田 祥寛
2004/03/13
 
対象OS
Windows 2000 Professional
Windows 2000 Server
Windows XP Home Edition
Windows XP Professional
Windows Server 2003
メール送信用コンポーネントBasp21を利用することで、ExcelやAccess上で管理されたメール・アドレスに対して、いっせいにメール送信することが可能になる。
しかしメール送信用のデータをハード・コーディングしてしまうと、本文を変更するためだけにプログラムそのものを変更する必要があり、不便なケースが少なくない。
そこで、メール送信用のデータをあらかじめテキスト・ファイルとして外部データ化しておくことで、モジュールの再利用が容易になる。
 
解説

 別稿のTIPS「配信リストを使ってメールをいっせいに配信する」では、メール配信用コンポーネントBasp21を利用することで、Excel上で管理されたメール・アドレスに対して、いっせいにメール送信を行う方法を紹介した。

 しかしそこで紹介した方法には、いくつかの問題点が含まれていた。

 1つに、メール送信に際して必要な件名や差出人、本文などのデータがすべてVBAのコードとしてハード・コーディングされていたため、メールの内容を変更するだけのためにもプログラマの手を介さなければならなかった。

 またメール本文が固定的なテキストとして記述されていたため、例えば個々のメールにそれぞれのあて先を付加しようと思った場合にも対応することができなかった。

 そこで本TIPSでは、メール送信に必要な情報を外部ファイル化すると同時に、メール本文に動的に変更可能な「変数」を含められるように改良してみよう。今回は、ExcelのVBA以外での例を示すため、メール・アドレスの管理ツールとしてAccessを利用し、メール送信用のコード(プログラム)としてはWSH(Windows Scripting Host)を使ってコーディングしてみたい。

 それではさっそく、作成までの流れを見てみることにしよう。


作業手順

手順1―追加コンポーネント「Basp21」をインストールする

 まずは、サンプル実行に必要な追加コンポーネント「Basp21」をインストールしておこう。Basp21についての詳細は、別TIPSの「配信リストを使ってメールをいっせいに配信する」で紹介しているので、参照していただきたい。Basp21のダウンロード先は、以下のとおりである。

手順2―メール・アドレス管理用のAccessのデータベース・テーブルを用意する

 メール・アドレス管理用のテーブルを、あらかじめAccessデータベース上に作成しておこう。データベースのファイル名は「mail.mdb」、テーブル名は「mail」とする。もちろん、ファイル名・テーブル名ともに自由に変更して構わないが、その場合には以下のコード中の該当個所も変更の必要があるので注意して欲しい。mailテーブルのレイアウトは以下のとおりである。定義したテーブル内には、適宜必要に応じて、配布先となるメール・アドレスをセットしておくこと。

フィールド名 データ型(文字長) 概要
email テキスト型(255) 電子メール・アドレス(主キーに設定)
name テキスト型(50) 受信者名
mailテーブルのフィールド・レイアウト
emailには送信先の電子メール・アドレスを、nameにはそのメール・アドレスの表示名をそれぞれセットする。

手順3―メール送信用の基本データを用意する

 次に、メールを送信する際に使用する基本データを、テキスト・ファイルとして用意しておこう。ファイル名はmail.datとする。データベース・ファイルと同様に、ファイル名は自由に変更して構わないが、その場合にはコード中の該当個所も変更の必要があるので注意して欲しい。

 mail.datに含まれる基本データのフォーマットは以下のとおりである。

ファイルmail.dat:

smtp.xxxxx.ne.jp    …送信時に使用するSMTPサーバ名
WINGSニュース <XXXXXX@nifty.com>    …送信者名<送信者アドレス>
WINGS NEWS[2004/04/05]Office TIPS開始    …メールの件名
$name$ 様    …4行目以降がメール本文と見なされる

このたび、Office TIPSが連載開始になりました。
うんぬんかんぬん

Written By YAMADA, Yoshihiro

 このファイルの先頭3行の内容は常にこの順番で記述していただきたい。それぞれ、送信に使用するメール・サーバ(SMTPサーバ)、メールの送信元に使われる「表示名」と「メール・アドレス」(メール・アドレスは"<"と">"で囲むこと)、そしてメールの件名(サブジェクト)である。4行目以降はメールの本文であり、4行目からファイルの最後までがメールの本文として送信される。

 メール本文(mail.datの4行目以降)には「$フィールド名$」の形式で変数を埋め込むことができる。例えば、「$name$」はmailテーブル内のnameフィールドの値で実行時に置き換えられる。本サンプルでは、このように本文中に変数を含めることで、受信者ごとに変更する情報を、データベース内で一元管理することができる。変数を追加した場合には、データベース上にも対応するフィールドを追加するだけでよい。

 なお、もしも「$フィールド名$」に対応するフィールドがデータベースの該当テーブル上に存在しない場合、変数は記述されたそのままの形式で残ってしまうので注意すること。

手順4―テキスト・エディタでスクリプトのコードを入力する

 最後に、mail.dat、mail.mdbからメール送信用のデータを取得し、実際のメール送信処理を行うためのWSHコードを記述してみよう。

 テキスト・エディタ(メモ帳でもなんでもよい)を開き、以下のコードを入力してほしい。なお、引用符(')で始まる行はコードの意味を解説するためのコメント部分なので、省略しても構わない。

ファイル:mail.wsf


<?xml version="1.0" encoding="Shift_JIS" standalone="yes" ?>
<package>
<job id="MailTrans">
<?job error="True" debug="True" ?>
<object id="objBsp" progid="Basp21" />
<object id="objDb"  progid="ADODB.Connection" />
<object id="objFs"  progid="Scripting.FileSystemObject" />
<script language="VBScript">
<![CDATA[
On Error Resume Next
Set objTs=objFs.OpenTextFile("mail.dat")
' 使用するSMTPサーバ(strSrv)、差出人(strFrm)、件名(strSbj)を
' テキストファイルから取得
strSrv=objTs.ReadLine()
strFrm=objTs.ReadLine()
strSbj=objTs.ReadLine()
' mail.datの4行目以降を本文として変数strBdyに格納
strBdy=""
Do While Not objTs.AtEndOfStream
  strBdy=strBdy & objTs.ReadLine() & Chr(13) & Chr(10)
Loop
' mail.mdbへの接続を読み取り専用で確立
objDb.Provider="Microsoft.Jet.OLEDB.4.0"
objDb.Mode=1
objDb.ConnectionString="mail.mdb"
objDb.Open()
' mailテーブルから全レコードを抽出
Set rs=objDb.Execute("SELECT * FROM mail")
' レコード単位にメール送信処理。その際、emailフィールドを変数strToにセット。
' また、xxxxフィールドの内容で変数strBdy(本文)に含まれる「$xxxx$」を置き
' 換え、変数strTmpに再セットする(xxxxには任意の文字列を指定可能だが、ここ
' では「$name$」がnameフィールドの内容で置き換えられる)。
' SendMailExメソッドでメールが送信される
Do While Not rs.EOF
  strTo =rs("email")
  strTmp=strBdy
  For i=0 To rs.Fields.Count-1
    strTmp=Replace(strTmp,"$" & rs.Fields.Item(i).Name & "$", rs.Fields.Item(i).Value)
  Next
  lngRst=objBsp.SendMailEx("send.log", strSrv, strTo, strFrm, strSbj, strTmp, "")
  rs.MoveNext
Loop
objDb.Close()
WScript.Echo("送信が完了しました!")
]]>
</script>
</job>
</package>
  • サンプル・ファイルのダウンロード
    :サンプルmail.zipをダウンロードするには、上のリンクを右クリックして、mail.zipというファイル名で保存する。mail.zipは、mail.wsf/mail.mdb/mail.datの3ファイルを含んでいるが、すべて同一のフォルダ上に展開する必要がある。なお間違えて送信してしまわないように、このサンプル・ファイルでは、メール・サーバ名や差出人名フィールドなどは無効なデータになっているので、必ず各自の環境に合わせて変更してから利用すること)

 WSHの実行ファイルは拡張子「.wsf」(Windows Scripting host File)とする必要がある。ファイル名自体は何でもよいが、ここでは「mail.wsf」という名前で、ローカルPC上の適当なフォルダ中に保存しておく。

手順5―WSHのコードを実行する

 mail.wsfを実行するには、エクスプローラなどからmail.wsfをダブルクリックするだけだ。その際、mail.datとmail.mdbがmail.wsfと同一のフォルダ中に存在しない場合や、SMTPサーバが指定されていない場合などには、正しく動作しない可能性があるので、注意すること。mail.mdbにセットしたあて先に、以下のようなメールが届いていれば成功だ。

一斉配信されたメールを受信したところ
本文冒頭のあて先に、データベースで管理された受信者名がセットされていることが確認できる。
  埋め込まれたデータ(受信者名)。この部分はデータベース中のnameフィールドから取り出して、埋め込まれている。

 なお、送信者側でメール送信の成否を確認したい場合には、同一フォルダ上にsend.logというログ・ファイルが生成されているはずである。これを参照することで、送信時に発生したエラーの有無を確認することができる。

送信時にBasp21によって記録されたログ情報
送信した時刻と使用したメール・サーバ、送信先と送信元のメール・アドレス、サブジェクトなどが記録されている。

 ただし、Basp21が管理する送信の成否は、あくまでSMTPサーバに対して送信処理を発行するまでの間である点に注意すること。あて先が不明であったり、相手のメールボックスの許容サイズが受信上限を超えていた、などのケースで不達となったメールについては、メールを中継しているSMTPサーバから、mail.datに記述された「送信者アドレス」に対してエラーが返される。End of Article

「Windows TIPS」


Windows Server Insider フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間