PowerShellでメールを送信する方法

こんにちは
けいぞうです。

先月友人に

ビットコインが100万円に戻ったら通知してくれるやつ作って

と依頼されたので、
PowerShellのモジュールを作成しました。ps1ファイルですね。

ps1ファイルはbatファイルから呼び出すようにし、
タスクスケジューラに登録して1時間に1回の繰り返し実行をすることにしています。

ps1ファイルの中ではBitCoinの最新の価格を記したファイル(別モジュールで15分に1回更新)を取得して、
100万円を超えていたら特定のメールアドレスにメールを送るということをしています。

この「メールを送る」というのが今回初めてでした。
といっても「自前のSMTPサーバーさえあれば」超簡単です。

以下、サンプルコードです。

# 宛先
$to = "testTo@example.com"

# 送信元
$from = "testFrom@example.com"

# SMTPサーバー
$smtp = "localhost" #IPアドレスでもホスト名でもいけます

# 件名
$subject = "件名"

# 本文
$body = "本文"

# ポート
$port = 25

# メールを送信します
Send-MailMessage -To $to -From $from -SmtpServer $smtp -Subject $subject -Body $body -Port $port -Encoding UTF8

たったこれだけ!楽勝~~

自前のSMTPサーバーをお持ちの方はPowerShellを起動してサクッとコピペしてみてください。送れます。

実際のところはSMTPサーバーなんて無い、
localにたてるのも面倒くさいって人がほとんどだと思います。
私もそうです。

私も実のところこの方法じゃなくて、 Office365のサーバー、いわゆるExchange Onlineを使ってメールを送信する方針を採用しました。
次回はそちらを紹介したいと思いますが、上記の方法を採れるなら断然楽です。

付録:::
実際のコードを載せておく(設定値はダミー)


BitCoinThresholdMail.ps1 - メインのモジュール


#設定ファイルを取得
$SettingPath = "設定ファイルのパス\IberryConfig.xml"
$Settingxml = [xml](Get-Content -Encoding Default $SettingPath)

#共通系メール設定
$MailCommonSetting = $Settingxml.IberrySetting.MailConfig.MailCommonSetting
$SMTPServer = $MailCommonSetting.SMTPServer.ToString()
$Port = $MailCommonSetting.Port.ToString()
$O365User = $MailCommonSetting.O365User.ToString()
$O365Pass = $MailCommonSetting.O365Pass.ToString()

#その他の設定
$BitCoinThresholdMail = $Settingxml.IberrySetting.MailConfig.BitCoinThresholdMail
$Subject = $BitCoinThresholdMail.Subject.ToString()
$Body = $BitCoinThresholdMail.Body.ToString()
$EmailFrom = $BitCoinThresholdMail.MailFrom.ToString()
$EmailTo = $BitCoinThresholdMail.MailTo.ToString()
$Threshold = $BitCoinThresholdMail.Threshold.ToString()
$NowPricePath = $BitCoinThresholdMail.NowPricePath.ToString()
$logFilePath = $BitCoinThresholdMail.logFilePath.ToString()
$NowPrice = Get-Content $NowPricePath
$Body = $Body -f $Threshold
$Subject = $Subject -f $Threshold

#メール送信判断
$SendMailFlag = $false
if([int]$NowPrice -gt [int]$Threshold) {
$SendMailFlag = $true
}
$date = Get-Date
"($date)" + "現在価格:" + $NowPrice + ", 閾値:" + $Threshold | Out-File $logFilePath -Encoding UTF8 -Append

#メール送信処理 
try {
if($SendMailFlag){
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, $Port) 
$SMTPClient.EnableSsl = $true 
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential($O365User,$O365Pass); 
$SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)
"メールを送信しました。" | Out-File $logFilePath -Encoding UTF8 -Append
"送信先:" + $EmailTo | Out-File $logFilePath -Encoding UTF8 -Append
}
}catch{
$_.Exception.Message | Out-File $logFilePath -Encoding UTF8 -Append
}


BitCoinThresholdMail.bat – ps1モジュールを呼び出すbatファイル


powershell -FILE ”ps1ファイルのパス"\BitCoinThresholdMail.ps1


IberryConfig.xml - 設定ファイル


<?xml version="1.0"?>
    <IberrySetting>
        <MailConfig>
        <!--メール共通設定-->
        <MailCommonSetting>
            <SMTPServer>smtp.offoce.com</SMTPServer>
            <Port>587</Port>
            <O365User>O365ユーザー名</O365User> 
            <O365Pass>パスワード</O365Pass>
        </MailCommonSetting>
        <BitCoinThresholdMail>
            <MailTo>メール送信先</MailTo> 
            <MailFrom>メール送信元</MailFrom>  
            <Subject>Bitcoinの価格が{0}円に到達しました。</Subject>  
            <Body>BitCoinの価格が{0}円に到達しました。
 このメールは自動送信されています。返信しないでください。
 返信してもいいです。</Body>  
            <Threshold>1,000,000</Threshold> 
            <NowPricePath>"BitCoin現在価格テキストのパス"\NowPrice.txt</NowPricePath>    
            <logFilePath>ログファイル出力先\BitCoinThresholdMail.log</logFilePath>    
        </BitCoinThresholdMail>  
        </MailConfig>  
    </IberrySetting> 

※「IBerry」というのは私が命名した名前なので何でも良いです