PowerShellを使ってメールを送信する方法を探すと2種類でてくる
・PowerShell cmdletの「Send-MailMessage」を使う
・Net.Mail.SmtpClient と Net.Mail.MailMessage を使う
UTF8で日本語メールを送る場合を考えると、Send-MailMessageを使用することで用が足りるようである。
ただ、Windows7で標準インストールとなるPowerShell v2.0だと、「Send-MailMessage -Encoding UTF8 ~」と指定すると、下記のエラーとなり、エンコーディングの指定がうまく行かない。そして、エンコーディングを指定せずに送ると日本語は文字化ける。
1 | Send-MailMessage : パラメーター 'Encoding' をバインドできません。"eutf8" の値を "System.String" 型から "System.Text.Encoding" 型に変換できません。 |
3 | + Send-MailMessage -Encoding eutf8 |
5 | + CategoryInfo : InvalidArgument: (:) [Send-MailMessage]、ParameterBindingException |
6 | + 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」の方を行う必要があるようだ。
そんなわけで、スクリプト例は下記の様になる。
なお、PowerShell Core 6.0でも利用できた。
10 | $mailbody="これはメールの送信テストです。`n"+"正常に送信出来ていますか?" |
12 | if($PSVersionTable.PSVersion.Major -gt 2){ |
13 | Send-MailMessage -From $mailfrom -To $mailtoArray -SmtpServer $smtpserver -Port $port -Encoding utf8 -Subject $mailsubject -Body $mailbody |
15 | # PowerShell v2.0用処理。ポート番号指定除去と、Encoding指定方法変更 |
16 | Send-MailMessage -From $mailfrom -To $mailtoArray -SmtpServer $smtpserver -Encoding ([System.Text.Encoding]::UTF8) -Subject $mailsubject -Body $mailbody |
え?
ISO-2022-JPでメール送らなくていいのかって?
いまどきUTF-8を受け取れない環境は論外なので気にしなくていいです。(iPhone/Androidの絵文字は基本Unicodeベースなので、送信されるメールはISO-2022-JPではありません)
“PowerShellを使って日本語メールを送信する方法(v2.0も対応する版)” への1件の返信