Articles

Adam the Automator

Posted on

今回の 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-MailMessageSMTPServerのパラメータ値を用意します。

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

コマンドレットには、ToCcBccという、カンマで区切られた複数の受信者をサポートする 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'

AttachmentsGet-ItemGet-ChildItemSend-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 パラメータを使って送信するメールに優先度を割り当てることができます。

Outlookでの優先度の高いメッセージ
Outlookでの優先度の高いメッセージ

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 を使用する

コメントを残す

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