コマンドラインでメール送信する方法 (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