PowerShellを使ってメールを送信する方法を探すと2種類でてくる
・PowerShell cmdletの「Send-MailMessage」を使う
・Net.Mail.SmtpClient と Net.Mail.MailMessage を使う
UTF8で日本語メールを送る場合を考えると、Send-MailMessageを使用することで用が足りるようである。
ただ、Windows7で標準インストールとなるPowerShell v2.0だと、「Send-MailMessage -Encoding UTF8 ~」と指定すると、下記のエラーとなり、エンコーディングの指定がうまく行かない。そして、エンコーディングを指定せずに送ると日本語は文字化ける。
Send-MailMessage : パラメーター 'Encoding' をバインドできません。"eutf8" の値を "System.String" 型から "System.Text.Encoding" 型に変換できません。 発生場所 行:1 文字:28 + Send-MailMessage -Encoding eutf8 + ~~~~~ + CategoryInfo : InvalidArgument: (:) [Send-MailMessage]、ParameterBindingException + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.SendMailMessage
これは、「UTF8」の代わりに、System.Text.Encodingに変換したUTF8を指定「([System.Text.Encoding]::UTF8)」することで解決できる。
また、PowerShell v2.0のSend-MailMessageには、SMTPポートの番号指定が無い。
25番以外の場合は、「Net.Mail.SmtpClient と Net.Mail.MailMessage」の方を行う必要があるようだ。
そんなわけで、スクリプト例は下記の様になる。
$smtpserver= "サーバ名" $port= 25 $mailfrom="ユーザ名@ドメイン名" $mailtoArray=@( "ユーザ1@ドメイン名", "ユーザ2@ドメイン名", "ユーザ3@ドメイン名" ) $mailsubject="メール送信テスト" $mailbody="これはメールの送信テストです。`n"+"正常に送信出来ていますか?" if($PSVersionTable.PSVersion.Major -gt 2){ Send-MailMessage -From $mailfrom -To $mailtoArray -SmtpServer $smtpserver -Port $port -Encoding utf8 -Subject $mailsubject -Body $mailbody }else{ # PowerShell v2.0用処理。ポート番号指定除去と、Encoding指定方法変更 Send-MailMessage -From $mailfrom -To $mailtoArray -SmtpServer $smtpserver -Encoding ([System.Text.Encoding]::UTF8) -Subject $mailsubject -Body $mailbody }