headermask image

Notice: Undefined variable: t in /var/www/user97185/data/www/system-administrators.info/yandex-ad.php on line 15

Notice: Undefined variable: r in /var/www/user97185/data/www/system-administrators.info/yandex-ad.php on line 15
Рекомендую: Фриланс-биржа | Кэшбэк-сервис | Интернет-бухгалтерия

Отправка SMTP сообщений с помощью PowerShell. Часть 2

В данной статье мы подробнее познакомимся как создать тело письма, которое вы хотите отправить через 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

Разберем данный пример подробнее:

  1. Объявляем переменную $emailbody. Она будет использована нами далее в скрипте для вставки тела письма.
  2. Используем командлет Get-ExchangeServer для получения в массив $servers списка всех серверов Exchange.
  3. Через командлет ForEach-Object (абривеатура для “foreach”) cmdlet перебираем все элементы массива и добавляем каждое имя сервера в строку $emailbody, включая (и это самая важная часть) символ перевода каретки.
  4. Запускаем скрипт, используя $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 по отправке почты.

 

Полезная информация

Быстрое и качественное строительство домов по современным технологиям.

Похожие посты
  • Отправка SMTP сообщений с помощью PowerShell. Часть 1
  • Отправка SMTP сообщений с помощью PowerShell. Часть 3
  • Отправка SMTP сообщений с помощью PowerShell. Часть 4
  • Как узнать установленную версию Powershell
  • Работа в режиме хостинга Exchange 2010 SP1. Часть 4 – получение и отправка почты
  • Удаленное подключение к Exchange 2010 с помощью Powershell…
  • PowerShell Plus for Free
  • Обновляем старые скрипты на их PowerShell аналоги
  • На следующей неделе 2 веб-трансляции Microsoft
  • Настройка уникального имени для SMTP баннера каждого коннектора получения в Exchange Server
  • One Comment

    1. А почему-бы не воспользоваться стандартным командлетом Send-MailMessage для отправки сообщений?

      1. Serg on September 25th, 2012 at 12:44 pm