タイトルの通りですが、PowerShellを使ってGmail送信するスクリプトを作ったのでメモします。
バックアップなどの処理結果を、Gmailで通知できたらよいなぁと思って用意したもの。宛先を引数に与えて実行したり、サブジェクトやメール本文はテキストから読み込むようにしたりなどしてます。改良の余地はあるが、ひとまず備忘録も兼ねて。
スクリプト
前提として、
- Gmailアカウントは固定でスクリプト内に記載します
- パスワードは平文で記載です
その1(ヘッダ全指定)
以下のヘッダ、本文をすべてスクリプト内に指定します。とりあえず、動きの確認も兼ねてということで。
- メールの送信先
- メールの宛先
- メール件名
- メール本文
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# Send Gmail Script # HeaderをScript内に指定(メール送信元/送信先/件名/本文) # gmail Account $AccountName = "xxxx@gmail.com" $Password = "xxxxpassword" # connect gmail $SMTPClient = New-Object Net.Mail.SmtpClient("smtp.gmail.com", 587) $SMTPClient.EnableSsl = $True $SMTPClient.Credentials = New-Object System.Net.NetworkCredential("$AccountName","$Password"); # Header $MailFrom = "$AccountName" $MailTo = "yyyy@yahoo.co.jp" $Subject = "メール送信テスト" $Body = "これはメール送信テストです。" # message object $Message = New-Object Net.Mail.MailMessage($MailFrom, $MailTo, $Subject, $Body) # send mail $SMTPClient.Send($Message) |
その2(宛先を引数で指定)
その1ではすべてスクリプト内に指定していたところを、宛先を引数として与えてスクリプトを実行するようにしてみる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# Send Gmail Script # 宛先を引数で指定 # gmail Account $AccountName = "xxxx@gmail.com" $Password = "xxxxpassword" # connect gmail $SMTPClient = New-Object Net.Mail.SmtpClient("smtp.gmail.com", 587) $SMTPClient.EnableSsl = $True $SMTPClient.Credentials = New-Object System.Net.NetworkCredential("$AccountName","$Password"); # Header $MailFrom = "$AccountName" $MailTo = $Args[0] $Subject = "メール送信テスト" $Body = "これはメール送信テストです。" # message object $Message = New-Object Net.Mail.MailMessage($MailFrom, $MailTo, $Subject, $Body) # send mail $SMTPClient.Send($Message) |
Usage を書くべきでした。今度追記します。
その3(件名・本文はテキストから読み込み)
さらにサブジェクトと本文をテキストから読み込む形にする。これでそれなりに実用的になったはず。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# Send Gmail Script # 宛先は引数で指定 / 件名・本文はテキスト読み込み # gmail Account $AccountName = "xxxx@gmail.com" $Password = "xxxxpassword" # connect gmail $SMTPClient = New-Object Net.Mail.SmtpClient("smtp.gmail.com", 587) $SMTPClient.EnableSsl = $True $SMTPClient.Credentials = New-Object System.Net.NetworkCredential("$AccountName","$Password"); # Header $MailFrom = "$AccountName" $MailTo = $Args[0] $Subject = Get-Content .\Subject.txt $Body = Get-Content .\body.txt -Raw # message object $Message = New-Object Net.Mail.MailMessage($MailFrom, $MailTo, $Subject, $Body) # send mail $SMTPClient.Send($Message) |
$Bodyに指定したGet-Contentの -Raw パラメータはテキストをまるごと読み込むので、メール本文を改行したい場合は、テキストファイル内に`r`n を明記する必要はなく-Rawパラメータをつけるだけで良い。-Rawを付けないと改行されない状態でメール送信される。ちなみに、-Rawを付けても付けなくても`r`nを記載した場合はそのまま表示される。
また、サブジェクトと本文読み込み用のテキストはあらかじめ用意する必要がある。例えば、Robocopyなどのバックアップ処理の結果をテキストに自動で書き込んでおくなどすれば、そのまま読み込むだけで一連の処理(バックアップ処理+処理結果通知)ができあがる。
おまけ
以下のエントリで紹介していますが、ROBOCOPYのログからエラーを抜粋する方法と組み合わせれば、エラー内容のみをメール通知することもできます。
以上です。
↓↓↓ 持っていると便利な一冊。