Как послать сообщение из PowerShell?

Как отправлять сообщения из PowerShell в Exchange Server 2010?

Активное использование PowerShell в Exchange Server 2010 вызывает необходимость отправки результатов выполнения скриптов по электронной почте. В PowerShell 1.0 не было встроенной функции отправки сообщений и приходилось использовать самописные  функции, основанные на отправке с помощью  .NET.  Плохого в этом ничего нет, но необходимость в них отпала, т.к. с  версии PowerShell 2.0 появился командлет   Send-MailMessage.  При его использовании существует несколько особенностей и о них я хочу рассказать ниже.

Я недавно смотрел Webcast  на сайте компании Idera, который проводил гуру PowerShell Mike Pfeiffer и обратил внимание, как он предлагает использовать данный командлет.  Идея предельно проста, все параметры загоняются в массив и передаются функции отправки в качестве параметра.  Так гораздо удобнее работать с  параметрами.

Скрипт отправки выглядит следующим образом:

$report="<pre>" +(Get-mailbox | sort| out-String)
$message = @{
to   = 'administrator@exchlab.ru'
from = 'report@exchlab.ru'
subject ='List of mailboxes'
body=$report
bodyashtml = $true
smtpserver= $env:computername
}
Send-MailMessage @message

После выполнения этих строк администратор получит сообщение следующего вида:

 

Давайте теперь разберем действия вышеприведённого скрипта.

$report="<pre>" +(Get-mailbox | sort| out-String)

Эта команда в строковую переменную $report записывает HTML тег «<pre>» и список почтовых ящиков, отсортированных по имени.
Тег «<pre>» нужен для нормального отображения в сообщении вывода команды get-mailbox, иначе символы сбиваются и читать их неудобно. По хорошему строку надо закрыть тегом «</pre>», но HTML нас прощает :-). Поскольку get-mailbox возвращает объекты, то out-string преобразует эти объекты в строки.

smtpserver= $env:computername

В этой строке указываем имя текущего компьютера, на котором установлен SMTP сервер и через него PowerShell будет отправлять сообщение. Имя сервера берется из переменной окружения COMPUTERNAME. Можно еще использовать конструкцию » (hostname)», но это противоречит традициям латвийского скриптописания. 🙂

Правда существует еще два тонких момента:

  1. Нужно создать новый Receive connector и разрешить на нем анонимный прием сообщений с IP сервера, который будет отправлять сообщения. Можно конечно отправлять от имени специальной учетной записи, что является более правильным способом, но тогда нужно каким-то образом хранить в скрипте или еще где-то пароль, что является плохой практикой. Поэтому остановимся на анонимной отправки с определенных IP адресов.
  2. Если отправка будет идти от анонимного пользователя, то нужно создать транспортное правило, которое  будет во  все сообщения, содержащие адрес отправителя report@exchlab.ru устанавливать заголовок  SCL = -1. Это нужно для того, чтобы отправленные сообщения не попадали в Junk email в Outlook. Вообще такое правило должно быть в любой организации, т.к. не все приложения умеют отправлять сообщения от учетных записей.
Если у вас возникнут затруднения при отправке или замечания по скрипту, то напиши те о них в комментариях.

Связанные записи:


, , ,

  • Kazun

    «все параметры загоняются в массив и передаются функции отправки в качестве параметра.» — Только не в массив,а в hashtable.

    Упомянул бы момент касаемо Send-MailMessage для любителей русского языка   и у кого проблемы с кодировкой в теле письма или темы,использовать параметр Encoding:

     $en = [Text.Encoding]::Unicode

    Send-MailMessage .. -Encoding $en

  • Pavel Nagaev

    Хм, а ведь и правда, русским языком  в отчетах я пользуюсь редко. Сам столкнулся недавно, но сюда не подумал даже написать.

     

     

  • Konstantin

    Добрый день!
    А как можно «получать» письма в PowerShell?
    Есть почтовый ящик, в который падают письма с заранее заданным форматом. По приходу письма его нужно разобрать (отправитель, тема, тело), проанализировать программно и отправить дальше результат анализа в зависимости от полученного результата.
    Разбор это моя задача, как отправлять прочитал.
    Заранее спасибо. 

  • Pavel Nagaev

    Делается через  EWS Message API, например так.

  • Pavel Nagaev
  • Konstantin

    Спасибо за ссылку, но если я правильно понял, то это работает только с Exchange 2007 и более свежим. У нас к сожалению пока стоит 2003.

  • http://www.facebook.com/profile.php?id=1386655156 Павел Нагаев

    Правильно, но в 2003 есть всякие CDO и думаю можно через них. Вот на VB работают. http://blogs.msdn.com/b/akashb/archive/2008/10/27/how-to-iterating-through-exchange-mailboxes-using-cdo-1-21.aspx

  • Konstantin

    Огромное спасибо :-), будет чем в выходные заняться <Dance>