How to Send an Email Using Windows PowerShell

Windows PowerShellは、WindowsやそのOS上で動作するアプリケーションの管理作業を行うためのコマンドラインシェルとして知られています。 同時に、特定の機能を実行するための軽量コマンドであるコマンドレットを作成することができるスクリプト言語でもあります。 そして今日は、PowerShell からメールを送信するコマンドレットである Send-MailMessage と、その他の処理方法について説明します。

PowerShellでメールを送信する最もシンプルなスクリプト

まずは簡単なことから始めてみましょう。

Send-MailMessage -To "<recipient’s email address>” -From "<sender’s email address>” -Subject "Your message subject” -Body "Some important plain text!” -Credential (Get-Credential) -SmtpServer "<smtp server>” -Port 587

必要なのは、送信者と受信者の電子メール アドレスを入力し、使用する SMTP サーバーを指定することだけです。 そして、このスクリプトをPowerShellにコピーペーストし、Enterキーを押します。

<

Mailtrapで動作するかどうかを確認しています。 サインアップして、Demoの受信箱に行きます。 SMTP認証情報を見つけて、次のようにスクリプトを微調整します:

Send-MailMessage -To "[email protected]” -From "[email protected]” -Subject "Hey, Jon” -Body "Some important plain text!” -Credential (Get-Credential) -SmtpServer "smtp.mailtrap.io” -Port 587

ここでは、SMTPホストを指定しただけです。 お察しのとおり、受信者と送信者のアドレスは実在しません。 これが偽のSMTPサーバーを使用する利点のひとつです。 メールのワークフローをテストするために、実際のメールを扱う必要がないのです。 あるいは、ダミーのメールを使うこともできますが、これはテストのやり方としては不十分です。 その理由は、ブログ記事「Why Using Dummy Email for Testing Just Doesn’t Work」でご紹介しています。

Mailtrapを無料でお試しください

このスクリプトをPowerShellにコピー&ペーストしてエンターキーを押すと、SMTP認証情報(ユーザー名とパスワード)を要求するウィンドウがポップアップしてきます。 このスクリプトをPowerShellに貼り付けてEnterキーを押すと、SMTP認証(ユーザー名とパスワード)を要求するウィンドウがポップアップします。 Demoの受信箱をチェックして、メッセージを見つけてください。

PowerShellからHTMLメールや添付ファイル付きのメールを複数の受信者に送ることはできますか

はい、できます! Send-MailMessageでは、HTMLコンテンツや優先度など、多くのパラメータを使ってメールをパワーアップすることができます。 また、対応するパラメータに複数の受信者を指定することで、複数の受信者にメールを送信することもできます。 ここでは、その活用方法をご紹介します。

iv

Parameter Description
-To 受信者または受信者の電子メールアドレス
-Bcc BCCの受信者または受信者の電子メールアドレス の受信者または受信者のメールアドレス
-Cc CCの受信者または受信者のメールアドレス
-From 送信者の電子メールアドレス
-Subject メールの件名
-Body メールの本文
-BodyAsHtml メールの本文がHTMLを含むことを定義する
-Attachments 添付されるファイル名とそのパス
-Credential アカウントからメールを送信するための認証。
-SmtpServer SMTPサーバーの名前
-Port SMTPサーバーのポート of the SMTP server
-DeliveryNotificationOption Formパラメータで指定された送信者に、メール配信時に通知を行います。 以下はそのオプションです。

  • None – 通知はオフ(デフォルトのパラメータ)
  • OnSuccess – 配信が成功した場合の通知。
  • OnFailure – 配信失敗の通知
  • Delay – 配信遅延の通知
  • OnFailure – 配信失敗の通知。
  • Never – 通知を受け取らない
  • -Encoding ボディとサブジェクトのエンコーディング
    -Priority メッセージの優先度のレベルを定義します。 有効なオプションは以下の通りです。

  • Normal (デフォルトのパラメータ)
  • Low
  • High
  • -UseSsl
    -UseSsl -UseSsl SMTPサーバーへの接続は、SSL(Secure Sockets Layer)プロトコルを使用して確立されます。 それでは、HTMLテキストと添付ファイルを含むメールを送信するスクリプトを作ってみましょう。

    $From = "[email protected]"$To = "[email protected]", "[email protected]”$Cc = "[email protected]"$Attachment = "C:\Temp\Drogon.jpg"$Subject = "Photos of Drogon"$Body = "<h2>Guys, look at these pics of Drogon!</h2><br><br>"$Body += "He is so cute!” $SMTPServer = "smtp.mailtrap.io"$SMTPPort = "587"Send-MailMessage -From $From -to $To -Cc $Cc -Subject $Subject -Body $Body -BodyAsHtml -SmtpServer $SMTPServer -Port $SMTPPort -UseSsl -Credential (Get-Credential) -Attachments $Attachment

    お気づきのように、$Body +=を使ってメッセージの本文に改行を加えています。

    PowerShell のメールを無料でテストしてみましょう。

    GmailのSMTPサーバーを使ってPowerShellからメールを送信する

    テストのために偽のSMTPサーバーを使用する場合は、すべてがクールです。 しかし、Gmailのような本物のSMTPサーバーを使ってメッセージを送信する場合はどうでしょうか。 この場合、SMTP ホストとして smtp.gmail.com を追加し、送信者 (あなたの Gmail アドレス) と受信者に本物の電子メール アドレスを使用します。

    試しにポップアップ ウィンドウに認証情報を入力してみました。 しかし、サーバーはエラーを返してきました – 551 Authentication Required。 この問題を解決するには、Googleアカウントの[セキュリティ]タブで[安全性の低いアプリのアクセス]をオンにする必要があります。 その結果、PowerShellはメッセージを送信先に届けることに成功しました。 SMTP レスポンス コードとコマンドの詳細については、専用のブログ記事をご覧ください。

    一般的なメール プロバイダーのSMTP設定

    すべての人がGmailユーザーというわけではありません。 そのため、他のSMTPホストを使用している場合は、以下のデータがポイントになるかもしれません。

    td

    サービス SMTPサーバ ポート 接続
    Gmail smtp.gmail.com 587
    25
    465
    TLS
    SSL
    Office 365 smtp.office365.com 587
    25
    TLS
    Outlook.com smtp-mail.outlook.com 587
    25
    TLS
    Yahooメール smtp.mail.yahoo.com 587
    25
    TLS
    Yahoo! 587
    25
    465
    TLS
    TLS
    SSL
    Windows Live Hotmail smtp.live.com 587
    25
    TLS
    Zoho smtp.zoho.com 587
    465
    TLS
    SSL

    EASendMailを使ってPowerShellからメールを送信する

    EASendMailはSMTPなどのプロトコルをサポートするSMTPコンポーネントです。 ESMTP(extended SMTP)、EWS(Exchange Web Service)、WebDAV(Web Distributed Authoring and Versioning)などのプロトコルをサポートするSMTPコンポーネントです。

    • ASP
    • VB
    • VBA
    • VC++
    • C++/CLI
    • C#
    • VB.NET
    • JavaScript
    • ASP.NET
    • Delphi

    また、EASendMailを使ってPowerShellからメールを送信することもできます。

    • Step 1: インストーラーを使ってEASendMailをインストールします
    • Step 2: 以下のスクリプトを作成します
    ::LoadFile("C:\Program Files (x86)\EASendMail\Lib\net20\EASendMail.dll")#change the path to the EASendMail.dll file if you have another build of run-time assembly for .NET Framework, .NET Core, or .NET Compact Frameworkfunction SendMailTo($sender, $name, $address, $subject, $body, $htmlFormat) { $mail = New-Object EASendMail.SmtpMail("TryIt") # you can replace "TryIt” with your license code for EASendMail SMTP component $mail.From.Address = $sender $recipient = New-Object EASendMail.MailAddress($name, $address) $mail.To.Add($recipient) > $null $mail.Subject = $subject if($htmlFormat) { $mail.HtmlBody = $body } else { $mail.TextBody = $body } $server = New-Object EASendMail.SmtpServer("smtp.mailtrap.io") $server.User = "*********" $server.Password = "*********" $server.Port = 587 $server.ConnectType = ::ConnectTryTLS# specify your settings of the SMTP server, username, password, port, and connection type $smtp = New-Object EASendMail.SmtpClient $smtp.SendMail($server, $mail)}function SendMailFromPowerShell () { $sender = "[email protected]" $name = "Jon Snow" $address = "[email protected]" $subject = "Happy Samhain" $body = "Jonny, congrats on Samhain!"# specify your settings of sender’s email address and name, recipient’s email address, as well as subject and body text of the message try { "Start to send email to {0} ..." -f $address SendMailTo $sender $name $address $subject $body "" "Email to {0} has been submitted to server!" -f $address } catch { "Failed to send email: {0}" -f $_.Exception.Message }}SendMailFromPowerShell
    • Step 3: スクリプトを実行し、Mailtrap Demoの受信箱を確認します。 以下はそのメッセージです。

    テスト開始

    EASendMailサービスキューを使用したPowerShellからのマスメール送信

    EASendMail SMTPコンポーネントは、大量のメールを送信するのに便利です。 このためには、複数のスレッドをコード化する必要はありません。 必要なのは、複数のスレッドを持つメッセージをバックグラウンドのキューに自動的に送信できるEASendMailサービスだけです。 HTML テンプレートを使用してメッセージを大量に送信する次のスクリプトを見てみましょう:

    ::LoadFile("C:\Program Files (x86)\EASendMail\Lib\net20\EASendMail.dll")#change the path to the EASendMail.dll file if you have another build of run-time assembly for .NET Framework, .NET Core, or .NET Compact Frameworkfunction SendMailToQueue($sender, $name, $address, $subject, $body, $htmlFormat) { $mail = New-Object EASendMail.SmtpMail("TryIt") $mail.From.Address = $sender $recipient = New-Object EASendMail.MailAddress($name, $address) $mail.To.Add($recipient) > $null $mail.Subject = $subject if($htmlFormat) { $mail.HtmlBody = $body } else { $mail.TextBody = $body } $server = New-Object EASendMail.SmtpServer("smtp.mailtrap.io") $server.User = "*********" $server.Password = "*********" $server.Port = 587 $server.ConnectType = ::ConnectTryTLS# specify your settings of the SMTP server, username, password, port, and connection type $smtp = New-Object EASendMail.SmtpClient $smtp.SendMailToQueue($server, $mail)}function OpenConnection () { $connectionString = "Server=localhost\AdminSystem;Database=test;Integrated security=SSPI;MultipleActiveResultSets=True;" Write-Host(("Connecting database {0} ..." -f $connectionString)) $sqlConnection = New-Object System.Data.SqlClient.SqlConnection $sqlConnection.ConnectionString = $connectionString# You can change the connection string to yours by specifying user and password: $connectionString = "Server=localhost\AdminSystem;Database=dbname;User Id=user;Password=yourpassword;MultipleActiveResultSets=True;" $sqlConnection.Open() Write-Host 'Connected' return $sqlConnection}function BuildHtmlBody ($sqlConnection) { Write-Host "Building HTML body based on database ..." $sqlQuery = "SELECT ID, Name, Email, Age, Department FROM users" $sqlCommand = New-Object System.Data.SqlClient.SqlCommand($sqlQuery, $sqlConnection); $reader = $sqlCommand.ExecuteReader() $html = "<!DOCTYPE html><html><body>" $html += "<div style=""font-family:'Segoe UI', Calibri, Arial, Helvetica; font-size: 14px; max-width: 768px;"">" $html += "Dear {name}, <br /><br />This is a congrats email on Samhain. <br />" $html += "Here is full data in table:<br /><br />" $html +="<table style='border-spacing: 0px; border-style: solid; border-color: #ccc; border-width: 0 0 1px 1px;'>" while ($reader.Read()) { $name = $reader.GetString(1) $address = $reader.GetString(2) $age = $reader.GetInt32(3) $department = $reader.GetString(4) $html += "<tr>" $html += "<td style='padding: 10px; border-style: solid; border-color: #ccc; border-width: 1px 1px 0 0;'>{0}</td>" -f $name $html += "<td style='padding: 10px; border-style: solid; border-color: #ccc; border-width: 1px 1px 0 0;'>{0}</td>" -f $address $html += "</tr>" } $reader.Close > $null $reader.Dispose > $null $sqlCommand.Close > $null $sqlCommand.Dispose > $null return $html}function SendMailFromDBToQueue () { $sender = "[email protected]" $subject = "Happy Samhain" $sqlConnection = OpenConnection $bodyTemplate = BuildHtmlBody($sqlConnection)$sqlQuery = "SELECT ID, Name, Email, Age, Department FROM users" $sqlCommand = New-Object System.Data.SqlClient.SqlCommand($sqlQuery, $sqlConnection); $reader = $sqlCommand.ExecuteReader() while ($reader.Read()) { $name = $reader.GetString(1).Trim() $address = $reader.GetString(2).Trim() $body = $bodyTemplate.Replace("{name}", $name) Write-Host(("Start to send email to {0} ..." -f $address)) SendMailToQueue $sender $name $address $subject $body "html" Write-Host(("Email to {0} has been submitted to easendmail service!" -f $address)) } $reader.Close > $null $reader.Dispose > $null $sqlCommand.Close > $null $sqlCommand.Dispose > $null $sqlConnection.Close > $null $sqlConnection.Dispose > $null } catch { "Failed to send email: {0}" -f $_.Exception.Message }}SendMailFromDBToQueue

    System.Net.Mail API を使用して PowerShell から電子メールを送信する

    Send-MailMessage コマンドレットは、PowerShell から電子メールを送信する最も一般的なオプションです。 しかし、これは必ずしもそうではありませんでした。 PowerShell 3.0 から利用できるようになったこのコマンドレットは、System.Net.Mail API をベースにしていました。 これは、電子メッセージをSMTPサーバーに送信するためのクラスを含む名前空間です。 配信は、SmtpClient.Send.Sendメソッドを使用して行われます。 次の例を見てみましょう:

    $EmailFrom = "[email protected]”$EmailTo = "[email protected]”$Subject = "Happy Samhain”$Body = "Jonny, congrats on Samhain!”$SMTPServer = "smtp.mailtrap.io”$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587)$SMTPClient.EnableSsl = $true$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("<username>", "<password>");$SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)

    MailtrapのDemoの受信箱をチェックすると、ほら、入っています。

    .Send メソッドを使用して、次のような修正された構文を使用することもできます。

    おわりに

    System.Net.Mail名前空間は、以前ブログで紹介したASP.NET C#でメッセージを作成・送信する際にも使用されます。 今日はこれでおしまいです。 今回のブログ記事でPowerShellの使い方の幅が広がったことを願っています。 私たちのブログをフォローして、あなたのプロジェクトに役立つノウハウを発見してください。

    この記事を楽しんでいただけましたら、ぜひシェアして広めてください。

    p

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です