PDA

Показать полную графическую версию : Подскажите с кодировкой при отправке по почте


VAFER
29-03-2013, 12:07
Для рассылки оповещений накидал вот такой скриптик:

param ($Body = "Нет текста" )
$CredUser = "user"
$CredPassword = "123"
$EmailFrom = "user@domen.ru"
$EmailTo = "admin@domen.ru"
$Subject = "Автоматическое оповещение от SCADA"
$Encoding = [System.Text.Encoding]::UTF8
$SMTPServer = "exchange.domen.ru"
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587)
$SMTPClient.EnableSsl = $true
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential($CredUser, $CredPassword);
$SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)

Но когда запускаю скрипт с параметром, переменная BODY приходит крякозябами.

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noprofile -command C:\TestScript.ps1 "приточка запустилась"

VAFER
29-03-2013, 12:11
и походу приходит только слово "приточка"

подскажите как грамотно решить эту задачу :-)

Kazun
29-03-2013, 12:25
1) Кодировка

$m = New-Object Net.Mail.MailMessage
$m.BodyEncoding = $Encoding
$m.Body = $Body
$m.SubjectEncoding = $Encoding
$m.Subject = $Subject
$m.To = $EmailTo
$m.From =$EmailFrom
$SMTPClient.Send($m)

2)
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noprofile -File C:\TestScript.ps1 "приточка запустилась"

PS. В PowerShell V3 у командлета Send-MailMessage есть параметр -Port
Send-MailMessage -From -To -Body -Port -Encoding -UseSsl -SmtpServer

VAFER
29-03-2013, 13:48
У меня Win2008 и PowerShell V2 :)

VAFER
29-03-2013, 14:05
Предложенный код не выполняется.

"To" является свойством ReadOnly.
C:\testscript.ps1:19 знак:4
+ $m. <<<< To = $EmailTo
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : PropertyAssignmentException

Исключение при вызове "Send" с "1" аргументами: "Необходимо указать получателя."
C:\testscript.ps1:21 знак:17
+ $SMTPClient.Send <<<< ($m)
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException

я сделал вот так, мб сам накосячил ?! :)

param ($Body = "Нет текста" )
$CredUser = "user"
$CredPassword = "123"
$EmailFrom = "user@domen.ru"
$EmailTo = "admin@domen.ru"
$Subject = "Автоматическое оповещение от SCADA"
$Encoding = [System.Text.Encoding]::UTF8
$SMTPServer = "exchange.domen.ru"
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587)
$SMTPClient.EnableSsl = $true
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential($CredUser, $CredPassword);

$m = New-Object Net.Mail.MailMessage
$m.BodyEncoding = $Encoding
$m.Body = $Body
$m.SubjectEncoding = $Encoding
$m.Subject = $Subject
$m.To = $EmailTo
$m.From =$EmailFrom
$SMTPClient.Send($m)

Kazun
29-03-2013, 14:17
Моя ошибка:
$m.To = $EmailTo заменить на $m.To.Add($EmailTo)

VAFER
29-03-2013, 14:44
Encoding не сработал :)

тема нормально, а BODY пришло:

яЁшЄюўър чряєёЄшырё№

причем если без параметра, то приходит читаемые:

Нет текста

я кажется понял в чем фишка
надо CMD файл, который вызывает скрипт, сохранить в другой кодировке

да, все верно
при вызове скрипта с командной строки (что мне в принципе и необходимо) - приходит нормально

СПАСИБО ЗА ПОМОЩЬ :bow:

Kazun
29-03-2013, 15:05
А если так попробовать?
$m.Body = $Body
$m.BodyEncoding = $Encoding
$m.BodyTransferEncoding = "Base64"




© OSzone.net 2001-2012