概要
- Outlook の新規メール作成は、Application#CreateItem(0)
- メールは、MailItem#display() で表示
- コマンドプロンプトから直接スクリプト名で実行すると wscript.exe で動く
今回のタスク
コマンドプロンプト(cmd.exe)で何らかの処理をして、その結果を Outlook のメールで送りたい。
でもコマンドプロンプトからコピペしたり、一時ファイルにリダイレクトしたりするのは面倒。
ということで、コマンドラインから実行することで、新規メールを作って、さらにその本文に標準入力の内容を貼り付けることのできるようなコマンドがほしい。
つまり、こんなふうに実行すると
C:\Users\daisuke>ipconfig /all | mail
こんなメールが作られるようなやつ。
スクリプト(JScript / WSH)
わりかし簡単だった。
var cscript = /\\cscript\.exe$/.test(WScript.FullName); var outlook = WScript.CreateObject("Outlook.Application"); var olMailItem = 0; var mail = outlook.CreateItem(0); if(cscript) { mail.body = WScript.StdIn.ReadAll(); } else if(0<WScript.Arguments.length) { mail.body = WScript.Arguments(0); } mail.Display();
スクリプトのポイント
- 標準入力は、WScript.StdIn で取得。FileSystemObject の TextStream とたぶん同じ型。
- cscript.exe で実行したときしか標準出入力は使えないので、WScript.FullName の値を調べて条件分岐
- 最終行で MailItem#Display() してるけど、これがないとメールが表示されない
- Outlook が起動していない状態で実行すると、コード終了と同時に Outlook も終了してしまう。起動している状態で実行するとそうはならないので、別にいいや。
問題点
上記スクリプトを cscript.exe の引数にして実行するとちゃんと動く(標準入力を読める)けど、以下のように、スクリプトの名前を直接コマンドとして実行すると、標準入力を読むことができない。
C:\Users\daisuke>ipconfig /all | mail.js
これは、このような方法で実行すると、cscript.exe ではなくて、既定のプログラムであるところの wscript.exe で実行されるから。
既定のプログラムの設定を変えるのもあれなので、面倒だけどスクリプトを実行するだけのバッチファイルを作った。
こんな内容。とくにひねりなし。あとはこれをパスの通ったところに配置すれば完了。
@echo off cscript.exe //nologo mail.js
参考文献
- Office Space: Microsoft Outlook の予定を作成する <http://technet.microsoft.com/ja-jp/library/ee692864.aspx>