Send-SmtpMail.ps1

Очень часто возникает необходимость отправить почтовое сообщение из скрипта, например отчет о выполнении, или какие-нибудь логи.

В комплекте PowerShell Community Extensions есть превосходный командлет Send-SmtpMail, но что делать если по каким то  причинам установка сторонних оснасток является проблемой? Ну или просто хочется сделать скрипт для которого нужен только сам PowerShell? А оказывается всё не так уж сложно. Ниже — скрипт который является простеньким аналогом вышеупомянутого командлета. Конечно это не полный клон по функционалу, но на большинство задач хватит, да и расширить не проблема.

Send-SmtpMail.ps1

param ( $Server = $SmtpHostPreference, # SMTP Сервер $From = $SmtpFromPreference, # Адрес отправителя [string[]]$To, # Получатели $Body = "", # Тело сообщения $Subject = "", # Тема сообщения [System.IO.FileInfo[]]$Attachment=@() # Вложения ) Write-Verbose "Создаем объекты SmtpClient и MailMessage" $SmtpClient = New-Object System.Net.Mail.SmtpClient $Message = New-Object System.Net.Mail.MailMessage Write-Verbose "Устанавливаем свойства этих объектов" $SmtpClient.Host = $Server $Message.Body = $Body $Message.Subject = $Subject $Message.From = $From Write-Verbose "Создаем и добавляем вложения" $Attachment | ForEach-Object { $a = New-Object System.Net.Mail.Attachment($_.fullname) $Message.Attachments.Add($a) } Write-Verbose "Добавляем получателей" $To | ForEach-Object {$Message.To.Add($_)} Write-Verbose "Отправляем сообщение" $smtpclient.Send($Message) Write-Verbose "Удаляем объекты" $Message.Dispose()

В скрипте я использовал командлет Write-Verbose, он выполняет две роли: Во-первых если указать ключ -Verbose при запуске скрипта, то эти сообщения будут выведены на экран. Ну и во-вторых — комментарии писать уже не нужно 🙂

Применять скрипт можно например так:

.\Send-SmtpMail.ps1 -to ктото@гдето.ru -server pochtovik -from дядя@гдето.ru -subject test -verbose

Или так:

$SmtpHostPreference = "pochtovik.domain.local" $SmtpFromPreference = "дядя@гдето.ru" .\Send-SmtpMail.ps1 -to ктото@гдето.ru -subject test -body "Hello there!" -attachment (dir c:\files\*.txt)

Причем $SmtpHostPreference и $SmtpFromPreference можно задать в профиле, и тогда не придется их указывать при каждом вызове скрипта.

PS: Для работы скрипта, должна быть разрешена анонимная отправка сообщений по SMTP. Хотя можно прикрутить и аутентификацию.

Реклама
Опубликовано в PowerShell. 5 комментариев »