В данной статье мы подробнее познакомимся как создать тело письма, которое вы хотите отправить через PowerShell.
В прошлой статье мы остановились на следующем коде:
# #.SYNOPSIS #Sends SMTP email via the Hub Transport server # #.EXAMPLE #.\Send-Email.ps1 -To "administrator@exchangeserverpro.net" -Subject "Test email" -Body "This is a test" # param( [string]$to, [string]$subject, [string]$body ) $smtpServer = "ho-ex2010-caht1.exchangeserverpro.net" $smtpFrom = "reports@exchangeserverpro.net" $smtpTo = $to $messageSubject = $subject $messageBody = $body $smtp = New-Object Net.Mail.SmtpClient($smtpServer) $smtp.Send($smtpFrom,$smtpTo,$messagesubject,$messagebody)
Теперь давайте продолжим наш пример добавив в него больше содержимого в тело письма.
Использование результатов вывода команда в качестве содержимого письма
При указании ключа -Body все что следует за ним будет являться телом письма. Это может быть как текстовая строка, так и результат выполнения другой команды. К примеру:
[PS] C:\Scripts>.\Send-Email.ps1 -To "administrator@exchangeserverpro.net" -Subject "List of Exchange Servers" -Body (Get-ExchangeServer)
Результатом работы будет следующее сообщение:
Однако как видно результат не вполне читаем, так как все сервера идут последовательно в одной строке. Давайте сделаем вывод более читабельным.
[PS] C:\Scripts>[string]$emailbody = "" [PS] C:\Scripts>$servers = Get-ExchangeServer [PS] C:\Scripts>foreach ($server in $servers) {$emailbody = $emailbody + $server.name + "`r`n"} [PS] C:\Scripts>.\Send-Email.ps1 -To "administrator@exchangeserverpro.net" -Subject "List of Exchange Servers" -Body $emailbody
Разберем данный пример подробнее:
- Объявляем переменную $emailbody. Она будет использована нами далее в скрипте для вставки тела письма.
- Используем командлет Get-ExchangeServer для получения в массив $servers списка всех серверов Exchange.
- Через командлет ForEach-Object (абривеатура для “foreach”) cmdlet перебираем все элементы массива и добавляем каждое имя сервера в строку $emailbody, включая (и это самая важная часть) символ перевода каретки.
- Запускаем скрипт, используя $emailbody в ключе -Body.
Результат выглядит намного лучше.
Однако понятно, что это лишь демонстрационный пример, позволяющий понять смысл. В реальности нам не нужно отправлять список серверов Exchange себе на почту, по крайней мере очень часто. .
Однако мы можем использовать данную технику для построения более полезных скриптов, например получать список почтовых ящиков без лимита, которые будем отправлять по почте каждый месяц.
Использование контента файла в качестве тела письма
Другой техникой для получения контента письма будет использование содержимого определенного файла.
К примеру, у меня запущен постоянный пинг между определенными серверами для обнаружения сетевых проблем. Запись пишется в лог каждый раз когда происходят потери. Каждый день на почту отправляется результат мониторинга..
# #.SYNOPSIS #Sends daily dropped ping report # #.EXAMPLE #.\Send-DroppedPingReport.ps1 # $smtpServer = "ho-ex2010-caht1.exchangeserverpro.net" $smtpFrom = "reports@exchangeserverpro.net" $smtpTo = "administrator@exchangeserverpro.net" $messageSubject = "Dropped ping report" [string]$messagebody = "" $logs = Get-Content C:\Logs\droppedpings.log foreach ($log in $logs ) { $messagebody = $messagebody + $log + "`r`n" } $smtp = New-Object Net.Mail.SmtpClient($smtpServer) $smtp.Send($smtpFrom,$smtpTo,$messagesubject,$messagebody)
В принципе описывать содержимое скрипта не имеет смысла. По сути в нем используется такая же техника, единственное отличие в принципе получения данных. В примеры выше массив наполнялся результатом вывода команды. В данном примере массив наполняется содержимым файла.
Как вы можете видеть это очень простой и удобный способ для создания информативных писем.
В следующих статьях мы продолжим знакомство с возможностями Powershell по отправке почты.
Полезная информация
Быстрое и качественное строительство домов по современным технологиям.
One Comment