PowerShell のバージョンに依存しないEメール送信関数

昨日PowerShell v3以上の環境用にSend-MailMessage コマンドレットのサンプルを書きましたが、利用環境のPowerShell バージョンによっては-Port オプションがないため正常に動作しません。
今回は、PowerShellのバージョンに依存しないEメール送信関数を書いてみました。
バッチ処理の結果をメール送信する仕組みなど、PowerShellのバージョンが新しい環境へ移行する時にこの関数を使っておけば楽かもしれません。。

環境に依存しないEメール送信関数

Send-Email関数は実行する環境において
  • PowerShellのバージョンをチェックし
  • v2ならSmtpClientを利用する
  • v3以上ならSend-MailMessage コマンドレットを利用する
よう、条件分岐を入れています。
尚、メール送信はOutlook.comのアカウント、SMTPサーバーを利用します。
function Send-Email
{
 [Cmdletbinding()]
 param
 (
  [string]$To,
  [string]$Subject,
  [string]$Body
 )

 #Settings
 $SmtpSv = "smtp-mail.outlook.com"
 $User = "xxxxx@outlook.jp"
 $Pwd = "xxxxxxx"
 $Port = 587
 $Encode = "UTF8"
 
 $From = $User
 
 switch($PSVersionTable.PSVersion.Major)
 {
  #PowerShell v2
  {$_ -eq 2}{
   $SMTPClient = New-Object Net.Mail.SmtpClient($SmtpSv, $Port)
   $SMTPClient.EnableSsl = $true
   $SMTPClient.Credentials = New-Object System.Net.NetworkCredential($User, $Pwd);
   $SMTPClient.Send($From, $To ,$Subject, $Body)
  }

  #PowerShell v3 and Over
  {$_ -gt 2}{
   #Credential
   $Pwd = $Pwd | ConvertTo-SecureString -AsPlainText -Force
   $cred = New-Object System.Management.Automation.PSCredential $From,$pwd
   
   #Send
   Send-MailMessage `
       -SmtpServer $SmtpSv `
       -Credential $cred `
       -UseSsl `
       -Encoding $Encode `
       -Port $Port `
       -To $To `
       -From $From `
       -Subject $Subject `
       -Body "$Body" `
  }
 }
}
テスト結果
テスト環境は2種類。
  • PowerShell v2(Windows Home Server 2011 64bit)
  • PowerShell v4(Windows 8.1 Update 1 32bit)
からSend-Mail関数を実行してみました。
実行結果は下記の通り、上はPowerShell v2、下がPowerShell v4です。
スポンサーリンク

スポンサーリンク