今回の PowerShell cmdlet of the day では、PowerShell cmdlet Send-MailMessage を取り上げます。
Send-MailMessage コマンドレットが電子メール メッセージを送信する方法は非常にたくさんありますので、すぐに飛び込んで、遭遇する可能性のある一般的な例をすべてカバーし始めましょう。
この記事は、PowerShell を使用して電子メールを送信する必要があり、構文を忘れてしまった場合に備えて、ブックマークするのに最適なリソースとなります。
目次
SMTPサーバー
すべての電子メールは、サーバーとポートを介してどこかのSMTPサーバーを経由する必要があります。 使用するSMTPサーバーを指定するには、SMTPServer
というパラメータを使用して、接続を確立してメールを中継するSMTPサーバーを指定します。
SMTPServer
$PSEmailServer
環境変数に格納されている値が使用されます。
PS51> $PSEmailServer = 'smtp.server.local'
ただし、この変数はPowerShellのセッションをまたいで保存されることはありません。 つまり、新しいPowerShellセッションを開くたびに定義しなければなりません。 このため、Send-MailMessage
SMTPServer
のパラメータ値を用意します。
PS51> Send-MailMessage -SmtpServer 'smtp.server.local'
ポート
デフォルトでは、コマンドレットがSMTPサーバーを通じて電子メールを送信しようとする値はポート25です。 これは、暗号化されていないプレーンなSMTPです。
ポートを25から変更する必要がある場合は、Port
パラメータを使用できます。
PS51> Send-MailMessage -SmtpServer 'smtp.server.local' -Port 587
受信者と発信者
To、Cc、Bcc フィールドのような方法で異なる受信者に電子メールを送信するために、コマンドレットはこれに対応するさまざまなパラメーターを持っています。
The To, Cc and Bcc Parameters in the Send-Mailmessage Cmdlet
コマンドレットには、To
Cc
Bcc
という、カンマで区切られた複数の受信者をサポートする 3 つのパラメーターがあります。
以下のように単一のアドレスを指定することができます。
PS51> Send-MailMessage -To -Cc -Bcc -Subject 'this is a subject'
また、各パラメータ値に対して複数の受信者を指定することもできます。
PS51> Send-MailMessage -To , -Cc , -Bcc , -Subject 'this is a subject'
Fromパラメータ
メール送信時には、From
パラメータを指定して、メールのReply-toヘッダーを設定することもできます。 このパラメータには1つのアドレスしか指定できません。
PS51> Send-MailMessage -From -To -Subject 'this is a subject'
デフォルトでは、電子メールアドレスを使用すると、受信者のFROMフィールドに電子メールアドレスが表示されます。
Adam Bertram <>
Subject
パラメータが使用されていることに注意してください。 このパラメータは必ず必要です。
本文
Body
パラメータを使用すると、メールの本文を指定することができます。
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body'
HTML形式のメールを送信する
メールの本文をプレーンテキストではなく、HTML形式で送信することもできます。 そのためには、プレーンテキストの場合と同じBody
パラメータを使用しますが、文字列にはHTMLを使用し、BodyAsHtml
スイッチパラメータを使用します。
$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 -To -Subject 'this is a subject' -Body $body -BodyAsHtml
上の例では、本文の文字列を
@'
'@
で囲んでいることに注意してください。 これを「ここ文字列」と呼びます。 これにより、メール本文でよく見られる、キャリッジリターンを含む長い文字列を定義することができます。
エンコード
メールの件名や本文に特殊な文字がある場合は、Encoding
パラメータを使用できます。 このパラメータを使うと、メールの件名や本文を、指定したエンコーディングタイプでエンコードしてから送信することができます。
ここにはいくつかのオプションがあります。
- ASCII (デフォルト)
- UTF8
- UTF7
- UTF32
- Unicode
- BigEndianUnicode
- Default
- OEM
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -Encoding UTF8
Attachments
このコマンドレットは、1つまたは複数のファイルを添付することもできます。
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -Attachments 'C:\file.doc'
コレクションで複数の添付ファイルを指定する場合は、コンマで区切って指定することもできます。
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -Attachments 'C:\file.doc','D:\report.xlsx'
Attachments
Get-Item
Get-ChildItem
Send-MailMessage
のコマンドレットにもファイルをパイプすることができます。
PS51> Get-ChildItem -Path 'C:\MyFiles' | Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body'
安全で認証された電子メール
デフォルトでは、コマンドレットはポート 25 上の暗号化されていない SMTP 通信で電子メールを送信します。
認証を必要とするSMTPサーバーを介して電子メールを中継しようとすると、コマンドは以下のようなエラーメッセージを表示して失敗します。 これにより、SMTPサーバーのポート587への接続を試み、メッセージ全体を暗号化するようコマンドレットに指示します。 また、Credential
パラメータを使用して、SMTP サーバーを認証するためのユーザー名/パスワードを指定する必要があります(常に?
PS51> $credential = Get-CredentialPS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -UseSsl -Port 587 -Credential $credential
上記では、
Get-Credential
コマンドレットを使用して、クレデンシャル(PSCredential)オブジェクトを取得しています。 これは、ユーザー名とパスワードを要求するためにスクリプトを停止させるインタラクティブなものであるため、時々問題になります。
一般的な電子メールの例として、Gmailを使用することがあります。
$gmailCred = Get-Credential$sendMailParams = @{ From = '' ## Must be gmail.com To = '' Subject = 'some subject' Body = 'some body' SMTPServer = 'smtp.gmail.com' SMTPPort = 587 UseSsl = $true Credential = $gmailCred}Send-MailMessage @sendMailParams
メールの優先度の割り当て
個人的には死んでほしいメールの機能のひとつですが、Priority
パラメータを使って送信するメールに優先度を割り当てることができます。
Send-mailmessageでは、3つの異なる優先度を持つメールを割り当てることができます。
- 通常(デフォルト)
- 高
- 低
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -Priority High
しかし、お願いだから、すべてのメールが高優先度だと思わないでください!
配信通知
最後に、メールの配信通知を指定することができます。 配信通知は、一部のメール クライアントでは通常、既読のレシートとして知られているものです。 配信通知では、電子メールが受信者に届いたときに通知を受けることができます。
配信通知をリクエストする際には、4つのオプションがあります。
- None(デフォルト)
- OnSuccess(メールの配信が成功した場合)
- OnFailure(配信が失敗した場合に通知)
- Delay (メールがSMTPサーバー経由で遅延する場合)
配信通知オプションは、DeliveryNotificationOptions
パラメータで指定できます。
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -DeliveryNotificationsOptions 'OnSuccess'
コンマで区切ることで、一度に複数の配信通知を要求することもできます。
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -DeliveryNotificationsOptions 'OnSuccess','OnFailure','Delay'
まとめ
この記事では、Send-mailmessageコマンドレットとその機能についてすべて学びました。 このコマンドレットが持つすべてのパラメーターを例とともに使用して、このコマンドレットを広範囲にカバーしました。
Further Reading
他の関連記事もぜひご覧ください!
-
Get-ChildItem
PowerShell cmdlet を使用する -
Set-Content
PowerShell cmdlet を使用する -
Out-File
PowerShell cmdlet を使用する