Windows標準機能とWSHを使ってメールを送信するTech TIPS

コマンド・プロンプトでメールを送信できれば、さまざまな管理業務などに応用することができる。その場合、Windowsの標準機能だけで送信できるようになっていると、OSプラットフォームを問わずに利用できる。Windowsシステムに含まれるCDOコンポーネントを利用することで、WSHスクリプトからメールを送信することができる。

» 2004年05月22日 05時00分 公開
[海津智宏]
「Tech TIPS」のインデックス

連載目次

対象OS:Windows 2000 Professional/Windows XP Professional/Windows 2000 Server/Windows Server 2003



解説

 いまや、メールがさまざまな仕事の起点になっているという人も多いのではないか。チームでの情報交換や会議の案内、社外の取引先との連絡などに加え、備忘録代わりのメッセージを自分自身にメールしているという人もいるようだ。

 こうなってくると、すべての情報通知をメールに一本化したくなる。特に読者がシステム管理者なら、さまざまな管理業務の通知をメールで受け取りたいと考えているかもしれない。例えば、サーバがハングアップしたとき、ファイアウォールがワームのアタックを受けたとき、ハードディスクの容量がいっぱいになったとき、アプリケーションのメモリ・リークによって使用可能メモリが逼迫(ひっぱく)したときなど、メールで通知を受けたいと思うだろう。携帯電話のメール・アドレスに転送すれば、どこにいてもサーバ・トラブルをいち早く把握できる。

 Windows 2000/XP/Server 2003には、CDO(Collaboration Data Objects)と呼ばれるメッセージング・コンポーネント(CDOSYS.DLL)が標準で搭載されており、これをWSH(Windows Script Host)スクリプトから利用すれば、スクリプトからのメール送信が可能になる。

 ここでは、CDOの使い方とWSH(VBScript)のサンプル・スクリプトをご紹介しよう。

操作方法

●必要環境と前準備

 CDOについては、マイクロソフトからもあまりまとまったドキュメントが提供されていない。今回紹介する方法でメールを送信するには、利用可能なCDOコンポーネントが存在し、SMTPサービスが利用できる必要があるのだが、Windows OSごとにこれらの条件がどうなっているのか不明だったので、DA Labで実際に各OSをインストールして確かめてみた。結果は以下のとおりである。

Windows OS CDO SMTPサービス
Windows 2000 Professional ○(デフォルトで使用可能)
Windows 2000 Server ○(デフォルトで使用可能)
Windows XP Professional ○(デフォルトで使用可能)
Windows XP Home Edition ×
Windows Server 2003 ○(マニュアル設定が必要)
Windows OSとCDO、SMTPサービスの利用可能性

 結論からいえば、Windows 2000(Professional/Server)やWindows XP Professionalでは、特に設定は不要で、デフォルトの状態で利用可能である。

 Windows Server 2003でも利用可能だが、セキュリティを強化するため、SMTPサービスはデフォルトではロックダウンされている。このためWindows Server 2003でメール送信を行うには、明示的にSMTPサービスを開始する必要がある。これには、コントロール・パネルの[プログラムの追加と削除]で[Windowsコンポーネントの追加と削除]アイテムをクリックし、[アプリケーション サーバー]−[インターネットインフォメーション サービス (IIS)]‐[SMTP Service]を追加する。

 Windows XP Home EditionにはSMTPサービスは提供されていない。従ってWindows XP Home EditionだけではCDOを利用したメール送信はできないが、外部のSMTPサーバを使えば送信可能である。具体的なスクリプトについては後述する。

●最も簡単な送信スクリプト

 それではさっそく、スクリプトを紹介しよう。まずは、自分自身のSMTPサービスを利用する最も単純なスクリプトである。

1: Set oMsg = CreateObject("CDO.Message")
2: oMsg.From = "mailsender@example.co.jp"
3: oMsg.To = "user@example.co.jp"
4: oMsg.Subject = "Test "
5: oMsg.TextBody = "テストメッセージです" & vbCrLf & Now
6: oMsg.Send

赤字の部分は、環境に応じて変更すること。



 1行目でCDOのメッセージ・オブジェクトを作成し、2行目以降でFromプロパティにメッセージの差出人を、Toプロパティにメッセージのあて先を、Subjectプロパティにメッセージの件名を、TextBodyプロパティにメッセージの本文を代入して、6行目でCDOオブジェクトのSendメソッドを実行し、メッセージを送信している。

 5行目のvbCrLfは改行コードの指定で、この位置に改行コードが挿入される。Nowは現在の日時を文字列で返すVBScriptの関数で、こうするとメッセージ本文の最後に発信時刻が記録される。

 ここでは各プロパティに差出人やあて先、メッセージ本文などを直接指定したが、より複雑なスクリプトを作成して、例えばイベントによってあて先や本文を切り替える、別ファイルに記録した複数のアドレスに同報送信するなどが可能である。ただしこれらは本稿の目的から外れるので説明しない。機会があれば別途解説することにしよう。

 試しに上記のスクリプトを実行してみよう。テキスト・エディタなどで上記のコードを入力し、ファイルに保存する(例えばMail.vbs)。ただし行頭の番号は説明のために付けたものなので、実際に入力してはいけない。次にコマンド・プロンプトを起動し、WSHスクリプトをコマンドラインから起動するためのcscriptで実行する。

D:\WSH> cscript Mail.vbs



 送信メールを受信した結果は次のとおり。

スクリプトで送信されたメール スクリプトで送信されたメール
このスクリプトを利用すると、システム・トラブルの発生などをメールで通知できるようになる。

●SMTPサービスが使えない場合

 SMTPサービスが提供されないWindows XP Home Editionを使っているか、何らかの理由でSMTPサービスをインストールできない場合には、自前のSMTPサービスを利用する代わりに、外部のSMTPサーバを利用してメッセージを送信することができる。これにはCDOのConfigurationプロパティを使う。サンプル・コードは次のとおり。

 1: Set oMsg = CreateObject("CDO.Message")
 2: oMsg.From = "mailsender@example.co.jp"
 3: oMsg.To = "user@example.co.jp"
 4: oMsg.Subject = "Test"
 5: oMsg.TextBody = "テストメッセージです" & vbCrLf & Now
 6: oMsg.Configuration.Fields.Item _
 7:   ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
 8: oMsg.Configuration.Fields.Item _
 9:   ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = _
10:     "mail.example.co.jp"
11: oMsg.Configuration.Fields.Item _
12:   ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
13: oMsg.Configuration.Fields.Update
14: oMsg.Send

赤字の部分は、環境に応じて変更すること。



 前半部分(5行目まで)は先ほどと同じだが、後半部分(6行目以降)でメール送信の設定を変更している。送信方法は、このようにCDOのConfigurationプロパティを使う。

 Configurationプロパティは、プログラムIDが“CDO.Configuration”のCOMオブジェクトになっており、このFieldsプロパティからそれぞれの設定にアクセスできる。各設定項目は「http://schemas.microsoft.com/」で始まるURIで識別される。これらのURIは、設定項目を表すキーワードでしかなく、ブラウザでアクセスしてもページが存在するわけではない。

 「.../sendusing」は送信方法を(7行目)、「.../smtpserver」はSMTPサーバの名前を(9行目)、「.../smtpserverport」はSMTPサービスを提供しているポート番号を(12行目)それぞれ表す。このサンプルでは、SMTPサーバに「mail.example.co.jp」の25番ポート(SMTPの標準ポート)を指定しているが、この部分はプロバイダのメール・サーバなど、運用する環境に合わせて変更していただきたい。なおsendusingに設定する数字は次の表のように決められている。

設定値 意味
1 ローカルSMTPサービスのピックアップ・ディレクトリにメールを配置する(デフォルトの動作)
2 SMTPポートに接続して送信する
3 OLE DBを利用してローカルのExchangeに接続する
sendusingの設定値

 デフォルト値は1である。先に紹介した「最も単純なスクリプト」では、CDOオブジェクトのConfigurationプロパティを指定していないが、その場合sendusingには1が使われ、ローカルのSMTPサービスが使われるというわけだ。

 今回は外部のSMTPサービスを使うためsendusing値に2を指定している。

 Configurationプロパティの値を設定したら、Updateメソッドにより設定を更新する(13行目)。最後にSendメソッドによりメールを送信している(14行目)。

■関連記事(Windows Server Insider)


■関連リンク


「Tech TIPS」のインデックス

Tech TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。