今日のPowerShellコマンドレットでは、PowerShellコマンドレットのSend-MailMessageをカバーします。このPowerShellコマンドレットは、1つの目的だけを持っており、それはさまざまな方法で電子メールを送信することです。
Send-MailMessageコマンドレットが電子メールメッセージを送信する方法が非常に多いため、すぐに始めて一般的な例をすべてカバーしましょう。この記事では、最も簡単な例から誰もが望まないいくつかのシナリオまで、多くの例をカバーしています。
この投稿は、PowerShellで電子メールを送信する必要があり、構文を忘れた場合に便利なリソースとなります。
SMTPサーバー
すべての電子メールは、サーバーとポートを介してSMTPサーバーを経由して送信される必要があります。SMTPサーバーを指定するには、SMTPServer
というパラメーターを使用して、接続を確立しメールを中継するSMTPサーバーを指定します。ただし、必須ではありません。
SMTPServer
パラメーターに値を指定しない場合、$PSEmailServer
環境変数に格納されている値が使用されます。この変数には他の変数と同様に値を割り当てることができます。
ただし、この変数はPowerShellのセッションを超えて存在しません。つまり、新しいPowerShellセッションが開かれるたびに定義する必要があります。そのため、Send-MailMessage
の参照の上に定義して使用するか、まったく定義しないことをお勧めします。代わりに、個人的にはSMTPServer
パラメータの値を指定します。これにより、外部の変数を管理する必要がなくなり、変更される可能性もありません。
ポート
デフォルトでは、このコマンドレットがSMTPサーバーを介してメールを送信しようとするポートは25です。これはプレーンな、暗号化されていないSMTPです。しかし、現在ではSSL/TLSを使用して暗号化されたメールを送信することが一般的です(これらのシナリオについては後ほど説明します)。
ポートを25以外に変更する必要がある場合は、Port
パラメータを使用できます。
受信者と送信者
To、Cc、Bccフィールドなどを介して異なる受信者にメールを送信するために、このコマンドレットにはさまざまなパラメータがあります。
Send-MailmessageコマンドレットのTo、Cc、およびBccパラメーター
このコマンドレットには、それぞれTo
、Cc
、Bcc
という名前の複数の受信者をカンマで区切って指定するための3つのパラメーターがあります。
以下のように単一のアドレスを指定することもできます。
また、各パラメーター値に複数の受信者を指定することもできます。
Fromパラメーター
電子メールを送信する際には、From
パラメータを指定することもできます。このパラメータは、メールの返信先ヘッダーを設定します。このパラメータでは1つのアドレスのみを許可します。受信者がメールに返信する場合、このメールアドレスが返信先となります。
デフォルトでは、メールアドレスを使用すると、受信者のFROMフィールドに単純にメールアドレスが表示されます。ただし、Service Account Mailboxのような名前やラベルを指定したい場合は、名前とメールアドレスを指定することもできます:
ここでは
Subject
パラメータが使用されています。このパラメータは常に必要です。すべての例でこのパラメータが使用されています。
本文
Body
パラメータを使用すると、メールの本文を指定することができます。最も単純な場合、任意のテキストを指定するだけで、コマンドレットがそれをプレーンテキストとして送信します。
HTML形式の本文の送信
テキストではなく、HTML形式でメールの本文を送信することもできます。その場合、プレーンテキストと同じBody
パラメータを使用しますが、文字列にはHTMLを使用し、BodyAsHtml
スイッチパラメータを使用します。
上記の例では、本文文字列を
@'
と'@
で囲みました。これはヒアドキュメントと呼ばれます。これにより、改行を含む通常のメール本文を定義することができます。ヒアドキュメントは文字列の書式を保持し、特にHTML形式のメール本文を定義するのに便利です。
エンコーディング
メールの件名や本文に特殊文字が含まれている場合は、Encoding
パラメータを使用することができます。このパラメータを使用すると、送信前に指定したエンコーディングタイプでメールの件名と本文をエンコードすることができます。
以下のオプションがあります:
- ASCII(デフォルト)
- UTF8
- UTF7
- UTF32
- Unicode
- BigEndianUnicode
- Default
- OEM
添付ファイル
このコマンドレットでは、1つ以上のファイルを添付することもできます。そのためには、Attachments
パラメータを使用し、添付するファイルのパスを指定します。
複数の添付ファイルを指定する場合は、カンマで区切ってコレクションで指定することもできます。
Attachments
パラメータは、Get-Item
やGet-ChildItem
などのコマンドレットを使用してファイルをパイプできることも特徴です。
安全で認証されたメール
デフォルトでは、このコマンドレットはポート25を介して暗号化されていないSMTP通信でメールを送信します。ただし、ユーザー名とパスワードを使用してSSL/TLS経由で暗号化されたメールを送信するためのサポートもあります。
認証が必要なSMTPサーバーを介してメールを中継しようとすると、以下のようなエラーメッセージが表示されてコマンドが失敗します。
この問題を解決するには、まずポート(通常はTLSの場合は587)とUseSsl
パラメーターを指定する必要があります。これにより、コマンドレットはSMTPサーバーのポート587に接続し、メッセージ全体を暗号化するようになります。通常、SMTPサーバーへの認証には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.
メールの優先度の割り当て
私個人としては廃止してほしいと思うメールの一機能ですが、Priority
パラメーターを使用して送信するメールの優先度を割り当てることができます。この優先度は、メールクライアントによってさまざまな方法で解釈されます。

Send-mailmessageでは、3つの異なる優先度をメールに割り当てることができます。
- 通常(デフォルト)
- 高
- 低
しかし、どうか神の愛において、あなたのすべてのメールが高優先度であると思わないでください!
配信通知
ついに、メールに配信通知を指定することができます。配信通知は、一部のメールクライアントで一般的に読み取り通知として知られています。配信通知を使用すると、メールが受信者によって受信された場合に通知を受けることができます。ただし、受信者はそれを許可する必要があります。
配信通知をリクエストする際には、4つのオプションがあります。
- なし(デフォルト)
- 成功時(メールの配信が成功した場合)
- 失敗時(配信に失敗した場合に通知)
- 遅延(メールがSMTPサーバーを介して遅延した場合)
配信通知オプションは、DeliveryNotificationOptions
パラメーターを使用して指定することができます。
また、カンマで区切って複数の配信通知を一度にリクエストすることもできます。
まとめ
この記事では、Send-mailmessageコマンドレットとそのパラメーターを詳しく説明しました。すべてのパラメーターと例を使用してこのコマンドレットを網羅しました。Send-mailmessageコマンドレットの使用時に参考となることを願っています。
さらなる読み物
関連する他の投稿もチェックしてください!