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 комментариев »

комментариев 5 to “Send-SmtpMail.ps1”

  1. Camelot Says:

    отлично! Неплохой вариант замены стороннему blat.exe (у которого синтаксис короче и проще, но это дополнительное приложение).

  2. Send-SmtpMail.ps1 - поддержка аутентификации и SSL « PowerShell и другие скрипты Says:

    […] Xaegr @ 9:13 Благодаря запросу на форуме течнета подновил скрипт добавив поддержку SSL и возможность указания учетных […]

  3. Andrey71 Says:

    Ludi. Uge sxoge s uma. Pri popitke zapustit skript
    $FromAddress = «froshgeiser@hs-albsig.de» ### Adress From
    $Login = «froshgeiser» ### Login
    $Password = «froshgeiser» ### Password
    $ToAddress = «froshgeiser@hs-albsig.de» ### AdressTo
    $MessageSubject = «Mailbox Size Report» ### MessageSubject
    $MessageBody = «Attached is the current list of mailbox sizes.» ### MessageBody
    $SendingServer = «izcexchange.hs-albsig.de» ### SMTP Server
    $PortNummer = 25 ### PortNummer

    $myMsg = New-Object System.Net.Mail.MailMessage $FromAddress, $ToAddress, $MessageSubject,$MessageBody

    $myMsg.IsBodyHtml = «False»
    $mySMTPServer = New-object Net.Mail.SmtpClient($SendingServer, $PortNummer)
    $myCredential = New-object System.Net.NetworkCredential($Login,$Password)
    $mySMTPServer.UseDefaultCredentials = 0
    $mySMTPServer.Credentials = $myCredential
    $mySMTPServer.Send($myMsg)

    polucau oshibku vse vrema

  4. Xaegr Says:

    Andrey71, не стоит сходить с ума😉 Лучше сообщите какую ошибку вы получаете, иначе помочь сложно😉

  5. Vasiliy Says:

    Хочу добавить к письму вложение по умолчанию (уз постоянного места файл с одним и тем же именем), как стоит отредактировать блок добавления вложения — не могу разобраться.


Обсуждение закрыто.

%d такие блоггеры, как: