社内SEの徒然なる日記

powerShellでメールを送ってみた

■ メール送信

死活監視ツールをpowerShellで頑張って作ります。
死活監視って、毎日やらないと意味がない業務なんですけど、暇な時はともかく
忙しい時は煩わしくてかなわない...

ならば、pingを打って通らなかった時だけ管理者にメールを通知してやればいい。
powerShellには「send-mailmessage」なるメール送信のコマンドがあるようなので
試してみました。

# エンコード
$encoding = [System.Text.Encoding]::UTF8

# メールアドレス(送信者)
[System.String]$fromAddress = "システム管理者 <******@k**az***.co.jp>"

# メールアドレス(受信者)
[System.String]$toAddress = "システム部 <******@testCom*.co.jp>"

# メールサーバ
[System.String]$serverAddress = "10.2**.1.*4"

# コマンド実行
send-mailmessage -from $fromAddress -to $toAddress -SmtpServer $serverAddress -Encoding $encoding -subject "件名" -Body "本文"


注意点はエンコードの指定です。
パラメータ -Encoding で設定するんですけど省略も可能です(省略時はASCIIになる)。
エンコードがASCIIだと全角文字は全滅状態(文字化けする)なので、送信先のメールサーバ
で使えるエンコードを指定してやります。
ベンダーによると、私の会社のメールサーバだとEUCかshift-jisらしい。
んで、指定できるエンコードを調べてみると...

-Encoding

本文と件名に使用されるエンコードを指定します。有効な値は、ASCII、UTF8、UTF7、UTF32、Unicode、BigEndianUnicode、Default、および OEM です。ASCII が既定値です。

参考URL:http://technet.microsoft.com/ja-jp/library/dd347693

え?これだけ?
この辺りの知識が乏しいので、どれを使えばいいのか分からん。
とりあえず、UTF8 にしたら動いたのでこれにしてみます。

外部に出るメールなら真面目に調べるんですけど、自社内(のさらに自部署)で完結するメールだし届けばいいか。

では、本日はここまで。

投稿記事の一覧:http://harikofu.web.fc2.com/

--- blog end ---

スポンサードリンク

PageTop

powerShellでpingを打ってみた

■ Ping

死活監視の自動可をしたくて、powerShellに挑戦しました。まずは、単純に通信(ping)の実装からやってみます。

powerShellでは、Test-Connectionってコマンドでpingを打てるようです。昔は「Pingの実行結果をログに吐いてテキスト解析して...」とか凄い苦労したのに、今ではちゃんと処理があるんですね。

まずは、こんな感じですかね?

# 対象機器のIPアドレスを格納した配列
[String[]]$addressAp = @('10.101.12.10','10.101.12.20','10.101.12.30')

# 実行結果を確認します。
for($i = 0; $i -lt $addressAp.Count; $i++) {

# Pingを実行します。
$pingAlive = @(Test-Connection -ComputerName $addressAp[$i] -Quiet)

# Ping成功の場合のみ、処理を実行します。
if ($pingAlive -eq $True) {
Write-Host ($addressAp[$i] + '=Ping成功')
} else {
Write-Host ($addressAp[$i] + '=Ping失敗')
}
}


配列に格納したIPアドレスにPingを連続実行します。Test-Connectionにパラメータ -Quiet を付けてやると、成功時はtrue、失敗時はfalseを返すようになります。

■ 一括実行

ちなみに、Test-Connectionは対象のアドレスを配列で渡してやる事も出来るようです。
そうすると、結果が配列で返却されます。具体的にはこんな感じ。

# APサーバ
[String[]]$addressAp = @('10.101.12.10','10.101.12.20','10.101.12.30')

# Pingを実行します。
$pingAlive = @(Test-Connection -ComputerName $addressAp -Quiet)

# 実行結果を確認します。
for($i = 0; $i -lt $pingAlive.Count; $i++) {

# Ping成功の場合のみ、処理を実行します。
if ($pingAlive[$i] -eq $True) {
Write-Host ($addressAp[$i] + '=Ping成功')
} else {
Write-Host ($addressAp[$i] + '=Ping失敗')
}
}


■ 後書き

結局、結果確認のためにfor文でぐるぐる回すので、Test-Connectionコマンドレットの実行場所以外は変わらないですね。

まぁ、取得した結果が配列になるので、それを別の処理に投げるような使い方をすれば意味が出てくるのかな?

投稿記事の一覧:http://harikofu.web.fc2.com/

--- blog end ---

スポンサードリンク

PageTop