2022-04-01

PowershellでSend-MailMessageを用いてメールを送信する方法

Windowsに関する記事

SMTPの設定ができているか確認を行うため、WindowsのPowershellを使ってメールを送信という機会がありました。その時に使用した方法を紹介します。

実行用コマンドの作成

今回はMicrosoft Office365のメールアカウント、送信サーバを使用します。

環境:Windows10

アカウントの状態を確認

SMTP認証が有効になっているか確認します。
Microsoft365管理センターにログインし、使用するユーザーをクリックして選択状態にします。右側にユーザの設定画面が表示されます。メニューから「メール」を選択し、更に「メールアプリを管理する」を選択。

Microsoft365管理センターでユーザ情報を確認

チェックボックスが並んでいますが、「認証済みSMTP」が有効になっていることを確認します。

SMTP認証が有効になっているか確認

送信コマンド

# ①
# 件名とメール本文
$subject = "件名:テストメール"
$body = "これはWindows PowerShellから送信されたメールです。"

# メール送信用パラメータの定義
$mail = @{
    from = "sendfrom@example.onmicrosoft.com";
    to = "sendto@example.co.jp";
    smtp_server = "smtp-mail.outlook.com";
    smtp_port = 587;
    user = "sendfrom@example.onmicrosoft.com";
    password = "**********";
}

# ②
$encoding = ([System.Text.Encoding]::UTF8);
$password = ConvertTo-SecureString $mail["password"] -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential $mail["user"], $password

# ③
# メールの送信
Send-MailMessage -To $mail["to"] `
-From $mail["from"] `
-SmtpServer $mail["smtp_server"] `
-Subject $subject `
-Body $body `
-Credential $credential `
-Port $mail["smtp_port"] `
-UseSsl `
-Encoding $encoding

# メッセージの表示
Write-Host "メールの送信が完了しました."

上記のパラメータを適宜読み替えて入力してください。PowerShellの画面にまるっと貼り付けてエンターキーを押すと送信処理が実行されます。

PowerShellの画面

受信アドレス側でメールが確認できました。

受信アドレス側でメールが確認できました

解説

①件名、本文、メール送信用のパラメータを定義
見やすくするため、一度変数として切り出しました。SMTP送信に必要となる情報を配列にまとめています。

# ①
# 件名とメール本文
$subject = "件名:テストメール"
$body = "これはWindows PowerShellから送信されたメールです。"

# メール送信用パラメータの定義
$mail = @{
    from = "sendfrom@example.onmicrosoft.com";
    to = "sendto@example.co.jp";
    smtp_server = "smtp-mail.outlook.com";
    smtp_port = 587;
    user = "sendfrom@example.onmicrosoft.com";
    password = "**********";
}

Microsoft Office365メールプロバイダの設定内容については下記をご確認ください。

https://support.microsoft.com/ja-jp/office/pop-imap-smtp-%E3%81%AE%E8%A8%AD%E5%AE%9A-8361e398-8af4-4e97-b147-6c6c4ac95353

②文字コード、認証情報の設定
メールの文字コードを指定します。UTF8のほか、UTF7、ASCIIなどを選択可能です。
AsPlainTextForceパラメーターは必須です。これらのパラメーターを指定しないと警告メッセージが表示されます。セキュリティで保護された文字列にプレーンテキストを使用しているためです。
セキュリティで保護された文字列を作成し、PSCredential()メソッドで資格情報オブジェクトを作成します。

# ②
$encoding = ([System.Text.Encoding]::UTF8);
$password = ConvertTo-SecureString $mail["password"] -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential $mail["user"], $password

③メールの送信

Send-MailMessage関数でメールを送信します。配列と変数に格納した値を使います。直接埋め込むより、コードが見やすく保守性が高いですね。

# ③
# メールの送信
Send-MailMessage -To $mail["to"] `
-From $mail["from"] `
-SmtpServer $mail["smtp_server"] `
-Subject $subject `
-Body $body `
-Credential $credential `
-Port $mail["smtp_port"] `
-UseSsl `
-Encoding $encoding

# メッセージの表示
Write-Host "メールの送信が完了しました."

スポンサーリンク

まとめ

以上が基本的なコマンドですが、Send-MailMessageコマンドのオプションで様々な設定が可能です。CCBCCなどの指定も可能です。興味のある方はいろいろと試してみてください。

https://docs.microsoft.com/ja-JP/previous-versions//dd347693(v=technet.10)