スポンサーリンク

コマンドラインでメール送信する方法 (WindowsのバッチでSMTP通信。CDO.Messageを使用)


プロジェクトに,コミュニケーションスキルの低いメンバがいる場合,どうしたらよいか。


一つの方法は,その人の作業を,何らかの手段によって「見える化」すること。


手軽な方法として,下記のような手がある。

  • プロジェクト内での共通操作(例えば,デプロイスクリプトの実行や,テストサーバへのデータ投入などのタスク)を,バッチ化する。
  • そのバッチを,バージョン管理システム上に置いて,全員が利用するようにする。
    • あるいは,SVNコミットのフックスクリプトのように,各種ツール利用時の同伴物という形をとってもよい。
  • そして,そのバッチの中に,メール送信処理を仕込む

あるメンバが,開発作業に関わるような何らかのアクションを取ったら,

その事が開発メンバ全員に自動通知される,というわけ。



以下は,そういったbatファイル内に組み込み可能な,WSHによるメール送信スクリプト。


ソフトやDLLはいっさい不要。Windowsさえあればよい。

WSH側

send_mail.js

// メール送信モジュール
//
//   cscript //nologo send_mail.js "件名" "本文"


// 引数を取得
var mail_subject = WScript.Arguments.Unnamed(0);
var mail_body    = WScript.Arguments.Unnamed(1);


// 設定項目
var from_mail_address = "メール送信元のメールアドレス";
var to_mail_addresses = "メール送信先のメールアドレス(半角カンマ区切り)";
var smtp_server_name  = "メール送信サーバ名";


// -------- ローカルマシンでのコマンドの実行結果を取得する関数 --------


var ws = WScript.CreateObject("WScript.Shell");

// コマンド実行結果を行ごとに配列として取得
function cmd_output_arr( str_cmd )
{
	// コマンド実行
	var proc = ws.Exec( "cmd /c " + str_cmd );
	
	// 終了まで待つ
	while( proc.Status == 0 )
	{
		WScript.Sleep(100);
	}
	
	// 出力を取得
	var str_out = proc.StdOut.ReadAll();
	
	// 末尾の空行を削除
	var arr = str_out.split("\r\n");
	arr.pop();
	
	return arr;
}

// コマンド実行結果を文字列として取得
function cmd_output( str_cmd )
{
	return cmd_output_arr( str_cmd ).join("\r\n");
}



// -------- メイン処理 --------


var mail = WScript.CreateObject("CDO.Message");
var schemas = "http://schemas.microsoft.com/cdo/configuration/";

// メール内容に関する設定
mail.From     = from_mail_address;
mail.To       = to_mail_addresses;
mail.Subject  = mail_subject;
mail.TextBody = mail_body + "\r\n\r\n"
	+ "日時:"     + cmd_output( "@echo %DATE% %TIME%" )  + "\r\n"
	+ "マシン名:" + cmd_output( "@hostname" )            + "\r\n"
	+ cmd_output( '@ipconfig | findstr /C:"IP Address"' ) + "\r\n"
;
mail.TextBodyPart.Charset = "ISO-2022-JP";

// メール送信に関する設定(XP Proなら不要)
mail.Configuration.Fields.Item( schemas + "sendusing" ) = 2;
mail.Configuration.Fields.Item( schemas + "smtpconnectiontimeout" ) = 30;
mail.Configuration.Fields.Item( schemas + "smtpserver" ) = smtp_server_name;
mail.Configuration.Fields.Item( schemas + "smtpserverport" ) = 25;
mail.Configuration.Fields.Update();

// 送信
mail.Send();

これだけあれば,コマンドラインからメール送信できる。
(使い方は,ソースコード内冒頭のコメントを参照。)

このバッチの実行者のマシン名とIPアドレスが,メール本文内に記載される。

WSHからメール送信するときのメモ
http://muumoo.jp/news/2007/02/21/0wsh...

  • SMTP認証
  • 添付ファイル
  • SSL
  • ただし,POP before SMTPだけはBASP21が必要

Windows標準機能とWSHを使ってメールを送信する
http://www.atmarkit.co.jp/fwin2k/win2...
Windows XP Home EditionにはSMTPサービスは提供されていない



コマンドプロンプトでコンピュータ名を確認したい
http://date07.blog114.fc2.com/blog-en...

BAT側

上記のメール送信スクリプトを,バッチ側から呼び出す。

@rem 何かの処理
〜〜〜〜〜〜


@rem 全メンバにメール通知
cscript //nologo send_mail.js

@pause

補足

以下は,SMAILというフリーソフトを使う方法。

コマンドラインでメール送信する方法 (リマインダシステムを3分で作ろう)
http://language-and-engineering.hatenablog.jp/entry/20081029/1225242779

関連する記事:

離席中のチャットのログを自動でメール送信してくれるソフトの作り方
http://language-and-engineering.hatenablog.jp/entry/20081207/1228642113


RailsでGMailを利用したメール送信 (ActionMailer + tlsmailの仕組みを理解しよう)
http://language-and-engineering.hatenablog.jp/entry/20091123/p1


Androidアプリで,HTTP通信のPOSTリクエストをする汎用クラス (文字化け無し+非同期タスク)
http://language-and-engineering.hatenablog.jp/entry/20111121/p1