Отправка письма с помощью PowerShell

Опубликовано: 23.10.2012
Автор: Виталий Бочкарев
Поддержать автора статьи по этой ссылке

Отправка письма в PowerShell отличается от той же процедуры в VBScript:

Send-MailMessage [-To] <string[]> [-Subject] <string> -From <string> [[-Body] <string>]
   [[-SmtpServer] <string>] [-Attachments <string[]>] [-Bcc <string[]>] [-BodyAsHtml]
   [-Cc <string[]>] [-Credential <PSCredential>]
   [-DeliveryNotificationOption {None | OnSuccess | OnFailure | Delay | Never}]
   [-Encoding <Encoding>] [-Priority {Normal | Low | High}] [-UseSsl] [<CommonParameters>]

Напомню, что в VBScript блок команд для отправки сообщения через SMTP сервер выглядел таким образом:

set objEmail = CreateObject("CDO.Message")
objEmail.From = sFrom

objEmail.To = sTo
objEmail.Subject = sSubject
objEmail.Textbody = sTextBody
objEmail.AddAttachment sPathToAttachment
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = _
   sExchangeServer
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
objEmail.Configuration.Fields.Update
objEmail.Send

Хотя команда в PowerShell дотаточно проста в использовании, я столкнулся с небольшими неприятностями, а точнее отличиями от VBScript:
1. Чтобы указать кодировку тела сообщения, нужно создавать специальную переменную типа System.Text.Encoding, напрямую в строке отправки сообщения этого сделать нельзя.
2. Чтобы указать несколько получателей, нужно создавать массив адресов.

Приведу пример на PowerShell, чтобы объяснить, как отправить письмо с помощью скрипта.

#Тема сообщения
$MessageSubject = "Custom report"
#Текст сообщения в формате HTML (можно использовать и простой текст)
$MessageBody = $Null
$MessageBody += "<head>"
$MessageBody += "<meta http-equiv=""Content-Type"" content=""UTF-8"" />"
$MessageBody += "</head>"
$MessageBody += "<body style=""font-family: 'Trebuchet MS';"">"
$MessageBody += "<h1>Report header</h1>"
$MessageBody += "<div>ReportText</div>"
$MessageBody += "</body>"
#Указание кодировки письма (может быть ASCII, UTF8, UTF7, UTF32, Unicode, BigEndianUnicode, Default и OEM)
$Encoding = [System.Text.Encoding]::UTF8
#Указание получателей письма
[string[]]$TO = "user1@domain.com", "user2@domain.com"
#Указание получателей копии письма
[string[]]$CC = "user3@domain.com"
#Отправка письма
Send-MailMessage -SmtpServer "smtp.server.com" -Encoding $Encoding -From "reports.server@domain.com"
   -To $TO -CC $CC -Subject $MessageSubject -BodyAsHtml $MessageBody