Send-MailMessageコマンドレットでメール送信
Windows系で何か監視したり検知したりしてメール通知したい時によく使うもの。
軽くチェックできればいい程度のことに大げさな監視システムや何かの実行環境入れたくないよね、じゃあPowerShellでやろうか、という。
必要なもの
使っていいメールサーバー。
使うコマンドレット
Send-MailMessage -SmtpServer $Server -From $From -To $To -Subject $Subject -Body $Body -Encoding $Encoding
他にもパラメータあるがおおむねこんな書き方。
長い。一行が長くなりがちなのはPowerShellの常だが、見通しが悪いので別な書き方にする。
スプラッティング(Splatting)による書き方
$MailParam = @{
SmtpServer = "mail.example.com"
From = "watcher@example.com"
To = "confirmer@example.com"
Subject = "メールタイトル"
Body = "メール本文"
Encoding = [System.Text.Encoding]::UTF8
}
Send-MailMessage @MailParam
パラメータを連想配列にしてコマンドレットに渡せる。
変数を$MailParam
でなく@をつけて@MailParam
と書くところに注目。MS語で分配演算子と呼ぶ。(エラーメッセージでしか見たことがない…)
こういう渡し方をスプラッティング(Splatting、分配する)という。見通しが良くなって修正や確認しやすいのでおすすめ。
詳細については MS docs の about_Splatting を読め。
実際に使う時はハードコートしないで他で組み立てた値を代入するほうがいい。
通知で使うなら、携帯メールの着信通知だけで内容わかるほうがいいので、検知した内容に合わせてタイトル本文を組み立てたり。(正常終了しましたとか、完了してませんとか)
複数の宛先へ送信したい
$mailparam = @{
To = @("confirmer1@example.com","confirmer2@example.com")
}
配列にしてやる。
Body内で改行したい
`r`n
を入れると改行される。CR+LFの意味。
エンコード指定
PowerShellで何か読んでどこかへ送ったり書き出すとホイホイ文字化けするので、どのコマンドレットでもEncodingパラメータはだいたい要る。
送信後の戻り値が無い
Send-MailMessage
は何も戻してくれない。
-PathThru
パラメータもないのでどうしたらいいやら。
送信できなかった時はエラー吐くので例外キャッチでどうにかこうにかしよう。
ただ、そこまでガッチリシッカリ漏れなく監視したいなら、専門の監視システム導入するほうが良いと思う。餅は餅屋。