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

PowerShellでテンプレートを使ってメールを一斉配信する

解説をスキップして操作方法を読む

山田 祥寛
2008/04/25
対象ソフトウェア
Windows PowerShell
Accessで管理されたメール・アドレスに対して、一斉にメールを送信できると便利である。
データベース・アクセスはSystem.Data.OleDb名前空間の、メール送信はSystem.Net.Mail名前空間の、クラスライブラリを利用することでそれぞれ実現できる。

解説

 TIPS「テンプレートを元に複数のメールを一括配信する」では、WSH(Windows Script Host)を利用したメールの一括配信について紹介した。本稿では、これをPowerShell上で行う方法について紹介する。

 そもそも、WSHでメール送信を行うには1つ制限があった。というのもWSHは標準ではメール送信のためのライブラリを持っていないため、先のTIPS記事では、メール配信のためのBasp21というコンポーネントを別にインストールして利用していたのである。

 だがPowerShellでは.NET Frameworkが提供する潤沢なライブラリ群をそのまま利用することができる。これらを使えば、追加コンポーネントのインストールなどは行うことなく、PowerShell標準の機能だけでメール送信を実現できる。

 本TIPSでは、Microsoft Accessで管理されたメール・アドレス情報を基に、PowerShellでメールを一斉配信する例を紹介する。また、配信するメール本文は差し替えが容易となるように、テキスト・ファイルとして外部ファイル化すると同時に、本文中には動的に変更可能な「変数」を含められるものとする。

操作方法

 *注意
PowerShellを利用するには、あらかじめシステムにユーザー自身がインストールしておく必要があります。具体的なインストール方法については「PowerShellをインストールする」を参照してください。

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

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

フィールド名 用途 データ型(文字長)
email 送信先メール・アドレス テキスト型(255)
name 本文中で参照する名前 テキスト型(50)
mailテーブルのフィールド・レイアウト
送信先のメール・アドレス情報を格納したテーブルを、Accessでこのように作っておく。サンプルのmail.mdbファイルは、以下のサンプル・コードとともに ここ に用意しておくので、参考にしていただきたい。

 定義したテーブル内には、適宜必要に応じて、配信先となるメール・アドレスと受信者の名前をセットしておくこと。

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

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

 mail.datに含まれるメール本文は、以下のとおりであるものとする。

※ファイル:mail.datの例。内容は適宜変更すること

{name} 様

このたび、めでたくPowerShell TIPSが連載開始になりました。
今後も精力的に更新していきますので、どうぞよろしくお願いします。

Written By YAMADA,Yoshihiro

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

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

手順3――テキスト・エディタでPowerShellのコードを入力する

Windows PowerShellコマンド&スクリプティング入門(後編)

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

 テキスト・エディタ(メモ帳でもなんでもよい)を開き、以下のコードを入力してほしい。なお、「#」で始まる行はコードの意味を解説するためのコメント部分なので、省略しても構わない(メール送信のロジックそのものは、関連記事を参照していただきたい)。

※ファイル:MailTransfer.ps1

$smtp = "smtp.examples.com" # 使用するSMTPサーバ
$from = "Xxxxx@examples.com"    # 差出人アドレス
$subject = "WINGS NEWS[2008/05/05]PowerShell TIPS連載開始"    # 件名

# mail.mdbに接続し、mailテーブルから全レコードを取得
$db = New-Object Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\tmp\mail.mdb")
$comm = New-Object System.Data.OleDb.OleDbCommand("SELECT * FROM mail", $db)
$db.Open()
$rs = $comm.ExecuteReader()

# メール配信のためのSmtpClientクラスをインスタンス化
$cli = New-Object Net.Mail.SmtpClient($smtp)
# テンプレートmail.datを読み込み、変数$bodyにセット
# Joinメソッドは、Get-Contentで読み込んだ1行単位のテキスト
# (文字列配列)を改行(`r`n)で連結

$body = [String]::Join("`r`n", (Get-Content mail.dat))

# レコード単位にメールを送信する処理
# XXXXXフィールドの内容で変数$body(本文)に含まれる「{XXXXX}」を置き換え、
# 変数$tmpに再セットする(XXXXXには任意の文字列を指定可能だが、ここでは
# 「{name}」がnameフィールドの内容で置き換えられる)

while($rs.Read()){
  $mail = New-Object Net.Mail.MailMessage($from, $rs["email"])
  $mail.Subject = $subject
  $tmp = $body
  for($i=0; $i -lt $rs.FieldCount; $i++){
    $tmp = $tmp -replace ("{" + $rs.GetName($i) + "}"), $rs.GetString($i)
  }
  $mail.Body = $tmp
  $mail.SubjectEncoding = [System.Text.Encoding]::GetEncoding("ISO-2022-JP")
  $mail.BodyEncoding = [System.Text.Encoding]::GetEncoding("ISO-2022-JP")
  $cli.Send($mail)  # メールを送信
}
$db.Close()
※ サンプル・ファイルMailTransfer.ps1をダウンロードするには、ここ をクリックしてください。

 PowerShellスクリプトの実行ファイルは拡張子を「.ps1」とする必要がある。ファイル名自体は何でも構わないが、ここでは「MailTransfer.ps1」という名前で保存しておこう。なお冒頭にあるリスト内の赤太字の部分は、サンプルでは仮の値をセットしている。このままでは正しく動作しないので、それぞれ自分の環境に合わせて値を書き換えていただきたい。

手順4――PowerShellのスクリプト・コードを実行する

 *注意
PowerShellでスクリプト・ファイルを実行する場合には、あらかじめいくつかの設定を行っておく必要がある。詳細については、「Windows PowerShellコマンド&スクリプティング入門(後編))」を参照していただきたい。

 MailTransfer.ps1を実行するには、PowerShellのプロンプトを開いたうえで、以下のようにコマンドを実行すればよい(カレント・フォルダにスクリプトが保存されているものとする *)。

PS > ./MailTransfer.ps1

 その際、mail.datがMailTransfer.ps1と同一のフォルダ中に存在しない場合や、指定したSMTPサーバやデータベース・ファイルへのパスなどが間違っている場合などには、スクリプトが正しく動作しない可能性があるので、注意すること。mail.mdbで管理しているあて先リストに、以下のようなメールが届いていれば成功だ。End of Article

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

「Windows TIPS」


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

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間