Send-MailMessage PowerShell Cmdletを使用したメールの簡単な送信

今日のPowerShellコマンドレットでは、PowerShellコマンドレットのSend-MailMessageをカバーします。このPowerShellコマンドレットは、1つの目的だけを持っており、それはさまざまな方法で電子メールを送信することです。

Send-MailMessageコマンドレットが電子メールメッセージを送信する方法が非常に多いため、すぐに始めて一般的な例をすべてカバーしましょう。この記事では、最も簡単な例から誰もが望まないいくつかのシナリオまで、多くの例をカバーしています。

この投稿は、PowerShellで電子メールを送信する必要があり、構文を忘れた場合に便利なリソースとなります。

SMTPサーバー

すべての電子メールは、サーバーとポートを介してSMTPサーバーを経由して送信される必要があります。SMTPサーバーを指定するには、SMTPServerというパラメーターを使用して、接続を確立しメールを中継するSMTPサーバーを指定します。ただし、必須ではありません。

SMTPServerパラメーターに値を指定しない場合、$PSEmailServer環境変数に格納されている値が使用されます。この変数には他の変数と同様に値を割り当てることができます。

Assigning a value to the $PSEmailServer preference variable
PS51> $PSEmailServer = 'smtp.server.local'

ただし、この変数はPowerShellのセッションを超えて存在しません。つまり、新しいPowerShellセッションが開かれるたびに定義する必要があります。そのため、Send-MailMessageの参照の上に定義して使用するか、まったく定義しないことをお勧めします。代わりに、個人的にはSMTPServerパラメータの値を指定します。これにより、外部の変数を管理する必要がなくなり、変更される可能性もありません。

PS51> Send-MailMessage -SmtpServer 'smtp.server.local'

ポート

デフォルトでは、このコマンドレットがSMTPサーバーを介してメールを送信しようとするポートは25です。これはプレーンな、暗号化されていないSMTPです。しかし、現在ではSSL/TLSを使用して暗号化されたメールを送信することが一般的です(これらのシナリオについては後ほど説明します)。

ポートを25以外に変更する必要がある場合は、Portパラメータを使用できます。

PS51> Send-MailMessage -SmtpServer 'smtp.server.local' -Port 587

受信者と送信者

ToCcBccフィールドなどを介して異なる受信者にメールを送信するために、このコマンドレットにはさまざまなパラメータがあります。

Send-MailmessageコマンドレットのTo、Cc、およびBccパラメーター

このコマンドレットには、それぞれToCcBccという名前の複数の受信者をカンマで区切って指定するための3つのパラメーターがあります。

以下のように単一のアドレスを指定することもできます。

Sending email to one recipient via To, Cc and Bcc
PS51> Send-MailMessage -To joe@gmail.com -Cc bob@gmail.com -Bcc susie@hotmail.com -Subject 'this is a subject'

また、各パラメーター値に複数の受信者を指定することもできます。

Sending email to multiple recipients via To, Cc and Bcc
PS51> Send-MailMessage -To joe@gmail.com, tony@mycompany.local -Cc bob@gmail.com, rick@othercompany.com -Bcc susie@hotmail.com,secret@fooorg.org -Subject 'this is a subject'

Fromパラメーター

電子メールを送信する際には、Fromパラメータを指定することもできます。このパラメータは、メールの返信先ヘッダーを設定します。このパラメータでは1つのアドレスのみを許可します。受信者がメールに返信する場合、このメールアドレスが返信先となります。

Sending email from an address
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject'

デフォルトでは、メールアドレスを使用すると、受信者のFROMフィールドに単純にメールアドレスが表示されます。ただし、Service Account Mailboxのような名前やラベルを指定したい場合は、名前とメールアドレスを指定することもできます:

Adam Bertram <adbertram@gmail.com>

ここではSubjectパラメータが使用されています。このパラメータは常に必要です。すべての例でこのパラメータが使用されています。

本文

Bodyパラメータを使用すると、メールの本文を指定することができます。最も単純な場合、任意のテキストを指定するだけで、コマンドレットがそれをプレーンテキストとして送信します。

PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body'

HTML形式の本文の送信

テキストではなく、HTML形式でメールの本文を送信することもできます。その場合、プレーンテキストと同じBodyパラメータを使用しますが、文字列にはHTMLを使用し、BodyAsHtmlスイッチパラメータを使用します。

Sending an HTML table in an email
$body = @' <table style="width:100%"> <tr> <th>Firstname</th> <th>Lastname</th> <th>Age</th> </tr> <tr> <td>Jill</td> <td>Smith</td> <td>50</td> </tr> <tr> <td>Eve</td> <td>Jackson</td> <td>94</td> </tr> </table> '@ PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body $body -BodyAsHtml

上記の例では、本文文字列を@''@で囲みました。これはヒアドキュメントと呼ばれます。これにより、改行を含む通常のメール本文を定義することができます。ヒアドキュメントは文字列の書式を保持し、特にHTML形式のメール本文を定義するのに便利です。

エンコーディング

メールの件名や本文に特殊文字が含まれている場合は、Encodingパラメータを使用することができます。このパラメータを使用すると、送信前に指定したエンコーディングタイプでメールの件名と本文をエンコードすることができます。

以下のオプションがあります:

  • ASCII(デフォルト)
  • UTF8
  • UTF7
  • UTF32
  • Unicode
  • BigEndianUnicode
  • Default
  • OEM
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body' -Encoding UTF8

添付ファイル

このコマンドレットでは、1つ以上のファイルを添付することもできます。そのためには、Attachmentsパラメータを使用し、添付するファイルのパスを指定します。

Attaching the C:\file.doc to an email
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body' -Attachments 'C:\file.doc'

複数の添付ファイルを指定する場合は、カンマで区切ってコレクションで指定することもできます。

Attaching the C:\file.doc and D:\report.xlsx file to an email
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body' -Attachments 'C:\file.doc','D:\report.xlsx'

Attachmentsパラメータは、Get-ItemGet-ChildItemなどのコマンドレットを使用してファイルをパイプできることも特徴です。

PS51> Get-ChildItem -Path 'C:\MyFiles' | Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body'

安全で認証されたメール

デフォルトでは、このコマンドレットはポート25を介して暗号化されていないSMTP通信でメールを送信します。ただし、ユーザー名とパスワードを使用してSSL/TLS経由で暗号化されたメールを送信するためのサポートもあります。

認証が必要なSMTPサーバーを介してメールを中継しようとすると、以下のようなエラーメッセージが表示されてコマンドが失敗します。

Error message when attempting to send unencrypted email.
The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.7.0 Must issue a STARTTLS command first.

この問題を解決するには、まずポート(通常はTLSの場合は587)とUseSslパラメーターを指定する必要があります。これにより、コマンドレットはSMTPサーバーのポート587に接続し、メッセージ全体を暗号化するようになります。通常、SMTPサーバーへの認証にはCredentialパラメーターを使用してユーザー名とパスワードも指定する必要があります。

PS51> $credential = Get-Credential
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body' -UseSsl -Port 587 -Credential $credential

上記では、Get-Credentialコマンドレットを使用して資格情報(PSCredentialオブジェクト)を取得しています。これはインタラクティブな操作であり、スクリプトの実行を停止してユーザー名とパスワードを要求します。これを防ぐためには、PSCredentialオブジェクトを即座に作成することができます。

A common email example is to use Gmail. Using the knowledge you’ve gained above, you can now easily send email through Gmail using the smtp.gmail.com SMTP server as shown below.

$gmailCred = Get-Credential

$sendMailParams = @{
    From = '[email protected]' ## 必ずgmail.comである必要があります
    To = '[email protected]'
    Subject = 'some subject'
    Body = 'some body'
    SMTPServer = 'smtp.gmail.com'
    SMTPPort = 587
    UseSsl = $true
    Credential = $gmailCred
}

Send-MailMessage @sendMailParams

メールの優先度の割り当て

私個人としては廃止してほしいと思うメールの一機能ですが、Priorityパラメーターを使用して送信するメールの優先度を割り当てることができます。この優先度は、メールクライアントによってさまざまな方法で解釈されます。

High priority message in Outlook

Send-mailmessageでは、3つの異なる優先度をメールに割り当てることができます。

  • 通常(デフォルト)
Assigning a high-priority email
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body' -Priority High

しかし、どうか神の愛において、あなたのすべてのメールが高優先度であると思わないでください!

配信通知

ついに、メールに配信通知を指定することができます。配信通知は、一部のメールクライアントで一般的に読み取り通知として知られています。配信通知を使用すると、メールが受信者によって受信された場合に通知を受けることができます。ただし、受信者はそれを許可する必要があります。

配信通知をリクエストする際には、4つのオプションがあります。

  • なし(デフォルト)
  • 成功時(メールの配信が成功した場合)
  • 失敗時(配信に失敗した場合に通知)
  • 遅延(メールがSMTPサーバーを介して遅延した場合)

配信通知オプションは、DeliveryNotificationOptionsパラメーターを使用して指定することができます。

Requesting a notification on delivery
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body' -DeliveryNotificationsOptions 'OnSuccess'

また、カンマで区切って複数の配信通知を一度にリクエストすることもできます。

Requesting a notification for all types
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body' -DeliveryNotificationsOptions 'OnSuccess','OnFailure','Delay'

まとめ

この記事では、Send-mailmessageコマンドレットとそのパラメーターを詳しく説明しました。すべてのパラメーターと例を使用してこのコマンドレットを網羅しました。Send-mailmessageコマンドレットの使用時に参考となることを願っています。

さらなる読み物

関連する他の投稿もチェックしてください!

Source:
https://adamtheautomator.com/send-mailmessage/