社内のメール環境はMicrosoft 365のExchange Online を利用しています。
サーバーの状況などをメールで送信したいことが多いため、Micrsoft 365 のアカウントを利用したスクリプトを作成しました。
以前作成した記事にパスワードファイルの利用方法を追加したスクリプトになります。
概要
Microsoft 365 のExchange Onlineのライセンスを利用したスクリプトのサンプルですが、アカウント情報をGmailや他のものに変更しても動作すると思います。
Send-MailMessage を利用したスクリプトです。
多要素認証を利用していると動作しないかもしれません。
他者が管理する機器で利用することを前提としているため、事前にパスワードファイルをスクリプトを利用して吐き出し、それを読み込んでアカウントの認証を行う方法となっています。
サンプルコード
パスワードファイルを出力するスクリプト
# Microsoft 365 account $account = "hoge1@hogehoge.co.jp" $password = ConvertTo-SecureString "hogehogehoge" -AsPlainText -Force # create credential $credential = New-Object System.Management.Automation.PSCredential ($account, $password) # password file destination $passwordFile = ".\password.dat" # create password file $credential.Password | ConvertFrom-SecureString | Set-Content $passwordFile
パスワードファイルを読み込んでメールを送信するスクリプト
# Microsoft 365 account $account = "hoge1@hogehoge.co.jp" $passwordFile = ".\password.dat" $password = Get-Content $passwordFile | ConvertTo-SecureString # create credential $credential = New-Object System.Management.Automation.PSCredential ($account, $password) # set Send-MailMessage params $mailParams = @{ SmtpServer = "smtp.office365.com" Port = "587" # or '25' if not using TLS UseSSL = $true ## or not if using non-TLS Credential = $credential From = "hoge1@hogehoge.co.jp" To = "hoge2@hogehoge.co.jp", "hoge3@hogehoge.co.jp" Subject = "SMTP Client Submission - $(Get-Date -Format g)" Body = "This is a test email using SMTP Client Submission" DeliveryNotificationOption = "OnFailure", "OnSuccess" Encoding = ([System.Text.Encoding]::UTF8) } # send message Send-MailMessage @mailParams
詳細
パスワードファイルを出力するスクリプト
使用するアカウント情報を設定しています。
パスワードについてはプレーンテキストを利用すると警告が表示されるため、セキュリティで保護されたテキストに変換しています。その際 -AsPlainText -Force オプションは必ず指定します。
$account = "hoge1@hogehoge.co.jp" $password = ConvertTo-SecureString "hogehogehoge" -AsPlainText -Force
PSCredential で資格情報を作成します。
$credential = New-Object System.Management.Automation.PSCredential ($account, $password)
パスワードファイルの出力先とファイル名を設定します。
サンプルではスクリプトと同フォルダーに出力します。
ファイル名に特に決まりはないため、運用にあった名前を設定してください。
極端な話、拡張子も .dat でも .pass でも .txt でもなんでもいいです。
$passwordFile = ".\password.dat"
パスワードファイルを読み込んでメールを送信するスクリプト
使用するアカウント情報を設定しています。
事前に作成したパスワードファイルからパスワードを読み込んでいます。
$account = "hoge1@hogehoge.co.jp" $passwordFile = ".\password.dat" $password = Get-Content $passwordFile | ConvertTo-SecureString
PSCredential で資格情報を作成します。
$credential = New-Object System.Management.Automation.PSCredential ($account, $password)
SMTPサーバーなどのサーバー情報や送り先などのパラメーターを設定します。
使用するサーバー似合わせて Port や SSL などを設定してください。
複数宛先を設定する際は “hoge2@hogehoge.co.jp”, “hoge3@hogehoge.co.jp” のように 「,」で区切っていきます。
文字化けを防ぐため、Encoding で文字コードを設定しています。
本文中で改行したい場合は`r`n
を入力します。改行コードであるCR+LFの意味です。
$mailParams = @{ SmtpServer = "smtp.office365.com" Port = "587" # or '25' if not using TLS UseSSL = $true ## or not if using non-TLS Credential = $credential From = "hoge1@hogehoge.co.jp" To = "hoge2@hogehoge.co.jp", "hoge3@hogehoge.co.jp" Subject = "SMTP Client Submission - $(Get-Date -Format g)" Body = "This is a test email using SMTP Client Submission" DeliveryNotificationOption = "OnFailure", "OnSuccess" Encoding = ([System.Text.Encoding]::UTF8) }
Send-MailMessage でメールを送信します。
Send-MailMessage @mailParams
おすすめ書籍
どこでもインターネットで調べることができますが、社内のセキュリティーポリシーでインターネットを利用できない場所で作業することもありますし、ネットワークトラブルで使用できないこともありますので、買って損はしない一冊です。
Windowsコマンドプロンプトポケットリファレンス
Windows PowerShell ポケットリファレンス
おわりに
PowerShell を用いてメールを送信するスクリプトでした。
以前の記事とは異なり、私以外も使用するPCで利用する前提のため、スクリプトで事前に吐き出したパスワードファイルを利用するようにしています。私は基本的にこの方法をとっています。もっとしっかりセキュリティーを考慮するのであれば、証明書を利用した方がいいと思います。
自分しか利用しないことが確定しているのであれば、以前の記事で紹介したスクリプト内にパスワードを記述する方法でも問題はないと思います。