WindowsのPowerShellで電子メールを送信する方法

WindowsのPowerShellで電子メールを送信する方法

Windows 8以降の「タスクスケジューラ」には、タスクの操作として「電子メールの送信(非推奨)」を選択できるものの、タスクの設定を保存しようとすると、以下のような画面が表示され、実質、電子メールの送信機能は利用できなくなっています。

WindowsのPowerShellで電子メールを送信する方法

そのため、タスクスケジューラ上のタスクなどで、電子メールを送信したい場合、電子メールを送信する処理をスクリプトファイルなどで自作する必要があります。

そこでここでは、PowerShellで電子メールを送信する方法として、Send-MailMessageコマンドレットを使った方法と、.NetFrameworkのSMTPClientクラスを使った方法を紹介します。

この記事は、以下の環境での動作結果を基にしています。他のエディションやバージョンでは、動作結果が異なる場合があることをご了承ください。

ソフトウェアバージョン
Windows 10 Pro 64bit1809

Send-MailMessageを使った方法

現在は、PowerShellのSend-MailMessageコマンドレットを使って電子メールを送信する方法が一般的です。

たとえば、GmailのSMTPサーバーを指定してSend-MailMessageコマンドレットを使って電子メールを送信する場合は、下のスクリプトをメモ帳などに貼り付けて、拡張子を「ps1」にして保存することで、メール送信するスクリプトファイルとして利用できます。

$MailSv = "smtp.gmail.com"
$Port = 587
$Encode = "UTF8"
$User = "<Googleアカウント名>"
$Pwd = "<アプリパスワード>" | ConvertTo-SecureString -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential $User,$Pwd

$From = "$User"
$To = "<宛先メールアドレス>"
$Subject = "メール送信テストです。"
$Body = @"
このメールは、テストです。
正しく表示されていますか?
"@

Send-MailMessage -To $To -From $From -SmtpServer $MailSv -Credential $Cred -UseSsl -Encoding $Encode -Port $Port -Subject $Subject -Body $Body

上のスクリプトの中で、最低限以下の変数を設定すればメール送信が可能になります。

$User - Googleアカウント名を入力します。

$Pwd - Googleアカウントのアプリパスワードを入力します。

$To - 宛先のメールアドレスを入力します。

$Subject - 件名を入力します。

$Body - 「@"」と「"@」の間に、本文を入力します。(改行も可能です)

コマンドレットに指定可能なパラメータなど、詳しい情報は以下のサイトをご覧ください。

Send-MailMessage - Microsoft Docs

SMTPClinetクラスを使った方法

Send-MailMessageコマンドレットが登場するまでは、.NetframeworkのSMTPClientクラスを使った方法が一般的でした。

たとえば、GmailのSMTPサーバーを指定して、SMTPClientクラスを使って電子メールを送信する場合は、下のスクリプトをメモ帳などに貼り付けて、拡張子を「ps1」にして保存することで、メール送信するスクリプトファイルとして利用できます。

$SMTPServer="smtp.gmail.com"
$Port="587"
$SMTPClient=New-Object Net.Mail.SmtpClient($SMTPServer,$Port)
$SMTPClient.EnableSsl=$true
$User="<Googleアカウント名>"
$Pwd="<アプリパスワード>"
$SMTPClient.Credentials=New-Object Net.NetworkCredential($User,$Pwd)

$From="$User"
$To="<宛先メールアドレス>"
$Subject = "メール送信テストです。"
$Body = @"
このメールは、テストです。
正しく表示されていますか?
"@
$MailMassage=New-Object Net.Mail.MailMessage($From,$To,$Subject,$body)
$SMTPClient.Send($MailMassage)

あとがき

ここでは、本文にテキストメッセージを直接入力していますが、状況に応じて必要な情報を記載するようカスタマイズすれば、より使い勝手がよくなると思います。