Windows
タスクスケジューラに登録したタスクが失敗した時に自動でメールを送信する
ヤス
更新日:2021/08/04
やりたいことを調べていると、海外のフォーラムしかなく、英語力のなさに苦労することが多いです。
動作検証環境:Microsoft Windows 64bit [Version 6.1.7601]
タスクが失敗したことを知りたい
タスクスケジューラが便利なため、Windows Serverで数多く利用しているのですが、問題なく稼働していたタスクがある日突然動かなくなっていて、1ヶ月ほど気付かなかったことがありました。
原因は単純な理由だったので、すぐ修正したのですが、今後のことを考えタスクが失敗した時に自動で通知される仕組みがほしいと思い、タスクの失敗時に自動でメールが送信される仕組みを考えました。下記の3つの仕組みで動作します。
自動メール通知の仕組み
- タスクスケジューラを作成し、トリガーのカスタムイベントフィルター設定で、タスクの失敗時という条件を設定する
- メール送信処理を実行するVBスクリプトを作成する
- タスクの失敗時に、実行結果内容を取得してメール送信を実行するバッチファイルを作成し、上記タスクに登録(メール送信処理は上記VBスクリプトが行う)
設定1:タスクの失敗時を検知するタスクの作成
- タスクスケジューラにタスク名「タスク失敗時メール送信」という名前で新規作成
- 作成したタスクのプロパティを開き、トリガータブでトリガーを新規作成
- タスクの開始で「イベント時」に選択し、「設定」で「カスタム」→「新しいイベントフィルター」を選択
- 新規に開かれた「新しいイベントフィルター」でXMLタブを選択し、「手動でクエリを編集する」にチェックをして、下記のコードを貼り付ける
1 2 3 4 5 |
<QueryList> <Query Id="0" Path="Microsoft-Windows-TaskScheduler/Operational"> <Select Path="Microsoft-Windows-TaskScheduler/Operational">*[System[(EventID=201)]] and Event[EventData[@Name="ActionSuccess"][Data[@Name="ResultCode"]="1"]] and Event[EventData[@Name="ActionSuccess"][Data[@Name="TaskName"]!="\タスク失敗時メール送信"]]</Select> </Query> </QueryList> |
コード説明
- Pathはイベントビューアーの「アプリケーションとサービスログ」→「Microsoft」→「Windows」→「TaskScheduler」→「Operational」を指定してます。
- タスクの操作完了のイベントIDのが「201」のため条件に追加
- タスクが正常に完了しなかった場合、リターンコードが「1」のため条件に追加※リターンコードが「1」以外のエラーも存在するが、頻度が少ないため無視
- 作成中のこのタスクが失敗した場合、処理が無限ループになってしまうので、自身を除く条件を追加
設定2:メール送信処理を実行するVBスクリプトを作成
メールの送信には、Windowsに標準で搭載されているVBスクリプトを使用します。
- 「mail_send.vps」というファイルを作成、下記のソースコードを貼り付ける※メールアドレスやパスワードは環境に応じて変更
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
'引数をメール内容として取得 MailContent = WScript.Arguments(0) 'メール送信オブジェクトの作成 Set objMail = CreateObject("CDO.Message") 'メール送信元アドレス設定 objMail.From = "username@xxx.yy.zz" 'メール送信先アドレス設定 objMail.To = "username@xxx.yy.zz" 'CcとBccが必要な時はコメントを外す 'objMail.Cc = "cc先メールアドレス" 'objMail.Bcc = "bcc先メールアドレス" 'メールタイトル objMail.Subject = "タスクの実行に失敗しました" 'メール本文の設定。改行を挿入し、現在時刻を追加。 objMail.TextBody = MailContent & vbCrLf & Now '添付ファイルが必要な時はコメントを外してファイルのフルパスを記入 'objMail.AddAttachment "添付ファイルのフルパス記入" 'SMTPサーバとサーバポートの指定 objMail.TextBodyPart.Charset = "ISO-2022-JP" objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/" + "sendusing") = 2 objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/" + "smtpserver") = "mailhost" objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/" + "smtpserverport") = 25 'SMTP認証が必要な時はコメントを外しユーザーネームとパスワードを記入 objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/" + "smtpauthenticate") = 1 objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/" + "sendusername") = "username@xxx.yy.zz" objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/" + "sendpassword") = "password" 'SSL送信が必要な時はコメントを外す 'objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/" + "smtpusessl") = true 'メールの送信 objMail.Configuration.Fields.Update objMail.Send |
設定3:タスクの実行結果内容を取得してメール送信を実行するバッチファイルを作成
- 「mail_send.bat」というファイルを作成、下記のソースコードを貼り付ける
- 設定1で作成したタスクのプロパティを開き、操作タブで操作を新規作成
-
新規に開かれた「新しい操作」で「プログラムの開始」を選択し、「プログラム/スクリプト」に「mail_send.bat」を選択
※メール送信ファイル(mail_send.vbs)はmail_send.batと同じディレクトリに保管してください
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
rem 実行されているファイルが置かれているカレントディレクトリへ移動 cd /d %~dp0 rem イベントログからタスクが失敗した最新のイベントをテキスト形式で取得する C:\Windows\SysWOW64\wevtutil.exe qe Microsoft-Windows-TaskScheduler/Operational /rd:true /f:text /c:1 /q:*"[System[(EventID=201)]] and Event[EventData[@Name='ActionSuccess'][Data[@Name='ResultCode']='1']]" > ./event_log.txt rem イベント情報からタスクの実行結果内容部分のみ抽出する findstr "タスク" ./event_log.txt > ./mail_content.txt rem 抽出した内容を変数に格納 for /f "tokens=*" %%i in (./mail_content.txt) do Set content="%%i" rem 抽出した内容を本文にしてメール送信。※メール送信ファイル(mail_send.vbs)はこのファイルと同じディレクトリに保管してください C:\Windows\SysWow64\cscript.exe ./mail_send.vbs %content% rem 作成したファイルの削除 del event_log.txt del mail_content.txt |