PowerShellでパスワードファイルを利用してメールを送信する(Microsoft 365)

Command

社内のメール環境は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で利用する前提のため、スクリプトで事前に吐き出したパスワードファイルを利用するようにしています。私は基本的にこの方法をとっています。もっとしっかりセキュリティーを考慮するのであれば、証明書を利用した方がいいと思います。
自分しか利用しないことが確定しているのであれば、以前の記事で紹介したスクリプト内にパスワードを記述する方法でも問題はないと思います。

タイトルとURLをコピーしました