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」の方を行う必要があるようだ。
そんなわけで、スクリプト例は下記の様になる。
なお、PowerShell Core 6.0でも利用できた。
$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
}
え?
ISO-2022-JPでメール送らなくていいのかって?
いまどきUTF-8を受け取れない環境は論外なので気にしなくていいです。(iPhone/Androidの絵文字は基本Unicodeベースなので、送信されるメールはISO-2022-JPではありません)
“PowerShellを使って日本語メールを送信する方法(v2.0も対応する版)” への1件の返信