Powershell – Отправка отчетов.

powershell logo- Вы не любите powershell? Да вы просто не умеете его готовить!

Речь сегодня пойдет о методиках отправки файлов отчетов средствами powershell.
Имея в руках такой инструмент как powershell мы можем отправлять что угодно двумя вариантами.

  1. анонимная отсылка сообщений
  2. авторизованная отправка

Традиционные примеры в виде двух скриптов, код которых по мере возможности прокомментирован.

Скрипт №1
Анонимная отправка сообщения.

# Примем по умолчанию папку в которой будем хранить отчеты C:\TEMP\reports\
# Если ее содержимое вам не нужно то раскомментируйте следующую строку
# Remove-Item C:\TEMP\reports\*.txt -force

# устанавливаем формат даты
$date = ( get-date ).ToString(‘yyyyMMdd’)
# Создаем файлы отчетов
$File1 = New-Item -type file "C:\TEMP\reports\$date-mailbox_storage.txt" -Force
$File2 = New-Item -type file "C:\TEMP\reports\$date-mailbox_report.txt" -Force

# от кого
$FromAddress = "exchange.admin@domain.com"
# кому
$ToAddress = "admin@domain.com"
$MessageSubject = "Exchange Server Daily Report"
$MessageBody = "Attached is the current list of mailbox and DataBases sizes."
# сервер через который будет производиться отправка
$SendingServer = "EXCAS"

# формируем первый отчет
Get-MailboxServer -Identity "EXMBX" | Get-MailboxDatabase | Select Identity, @{Name="Size (GB)";Expression={$objitem = (Get-MailboxDatabase $_.Identity); $path = "`\`\" + $objitem.server + "`\" + $objItem.EdbFilePath.DriveName.Remove(1).ToString() + "$"+ $objItem.EdbFilePath.PathName.Remove(0,2); $size = ((Get-ChildItem $path).length)/1048576KB; [math]::round($size, 2)}}, @{Name="No. Of Mbx";expression={(Get-Mailbox -Database $_.Identity | Measure-Object).Count}} | Sort -Property Identity | Format-table -AutoSize | Out-File $File1

# формируем второй отчет
Get-MailboxServer -Identity "EXMBX" | Get-MailboxStatistics | Sort-Object TotalItemSize -Descending | ft DisplayName,StorageLimitStatus,@{label="TotalItemSize(MB)";expression={$_.TotalItemSize.Value.ToMB()}},ItemCount | Out-File $File2

# Создаем почтовое сообщение
$SMTPMessage = New-Object System.Net.Mail.MailMessage $FromAddress, $ToAddress, $MessageSubject, $MessageBody

# приделываем к нему несколько аттачей
foreach ($File in ($File1, $File2)){
$Attachment = New-Object System.Net.Mail.Attachment $File
$SMTPMessage.Attachments.Add($Attachment)
}
# В случае если отчет всего один то конструкция будет такой
#$Attachment = New-Object System.Net.Mail.Attachment $File1
#$SMTPMessage.Attachments.Add($Attachment)

# Отсылаем сообщение
$SMTPClient = New-Object System.Net.Mail.SMTPClient $SendingServer
$SMTPClient.Send($SMTPMessage)

Стоит сказать что в случае если вам необходим набор отчетов то вы просто добавляете

$File3 = New-Item -type file «C:\TEMP\reports\$date-какойнибудь_report.txt» -Force

Не забываете его сформировать а затем прописать тут

foreach ($File in ($File1, $File2, $File3)){

Скрипт №2
В случае если необходима авторизованная отправка синтаксис немного меняется, но суть остается прежней.

  1. отчет можно выдергивать из заранее сформированного файла
  2. в переменную $mail.Body можно направлять вывод любой команды.
# Считаем что нам необходим файл file01.txt
$file = "C:\TEMP\reports\file01.txt"
$FileExists = Test-Path $file

# проверяем наличие файла
If ($FileExists -eq "False") {
Write-Host "sending mail"
# Создаем почтовое сообщение
$mail = New-Object System.Net.Mail.MailMessage

# Устанавливаем
$mail.From = New-Object System.Net.Mail.MailAddress("exchange.admin@domain.com")
$mail.To.Add("admin@domain.com")

# Устанавливаем тему сообщения
$mail.Subject = "report";
# Создаем тело сообщения из файла
$mail.Body = get-content $file

# Создаем почтовое сообщение
$smtp = New-Object System.Net.Mail.SmtpClient
# Указываем хост через который будем отправлять
$smtp.host = "EXCAS"

# Задаем пользователя от имени которого будет происходить отправка
$Credentials = new-object System.Net.networkCredential
$Credentials.domain = "DOMAIN"
$Credentials.UserName = "user.name"
$Credentials.Password = "P@$$W0rd"
$smtp.Credentials = $Credentials

# Производим отправку
$smtp.Send($mail)
# В случае необходимости удаляем файл
Remove-Item $file
} else {
Write-Host "File $file not found"
}


Информация об авторе

Сергей Мариничев.
Вы можете присоединиться ко мне в Facebook или в Twitter.

Если Вам понравилась статья, то вы можете подписаться на RSS.
А также бесплатно подписаться по E-mail и получать актуальную информацию в числе первых.

Получать обновления на email

Вы можете оставить комментарий.

13 Комментариев »

 
  • 3# kkvkkv (75 комм.):

    я сейчас пытаюсь отправить почту через скрипт .. и хочу сделать так. чтобы сам отчет был в теле письма
    скармливаю переменной $mail.Body = get-content $file , далее проверяю его $mail.Body оно нормально отображается построчно. когда отправляю себе письмо. то тело письма все делает в одну строку. как побороть можно?

      Цитировать

  • 6# kkvkkv (75 комм.):

    я когда делаю $BodyText = get-content C:\ReportVM\Backuplog_2010122_171344.txt | ConvertTo-Html
    то у меня вообще получается что-то странное выдается когда делаю вывод $BodyText

      Цитировать

  • 8# kkvkkv (75 комм.):

    проблема в самом формировании HTML
    мне требовалось просто перевести TXT -> HTML
    пришлось вот так сделать

    $StringsFile = get-content $BackuplogPath
    $OutStrings = «»
    foreach($StringsFile1 in $StringsFile){ $OutStrings = $OutStrings + $StringsFile1 + «» }
    $OutStrings = $OutStrings + «»

    можно и красивее, но как то так

      Цитировать

    • 9# admin (36 комм.):

      Действительно в формировании HTML есть определенные косяки, иногда проходит иногда нет.

      Предложенный вами способ тоже заслуживает внимания.

        Цитировать

  • 10# kkvkkv (75 комм.):

    он порезал
    $OutStrings = «(html)(body)»
    $OutStrings = OutStrings + «(/html)(/body)»

      Цитировать

    • 11# admin (36 комм.):

      у меня замечательно пашет вот такая конструкция.
      правда приходится сначала формировать HTML файл…

      # send_notify.ps1
      # version 0.2

      function send-notify {
      param([string]$ToAddress=(Throw ‘$ToAddress is required!’))

      $SendingServer = «xx.xx.xx.xx»
      $addresses = $ToAddress
      if($ToAddress -isnot [Object[]]) {
      $addresses = ([string]$ToAddress).Split(«;»)
      }

      $SMTPMessage = New-Object System.Net.Mail.MailMessage
      $SMTPMessage.Body = Get-Content «C:\Program Files\Tools\report\template.htm»
      $SMTPMessage.IsBodyHtml = $true
      $SMTPMessage.From = «service.desk@domain.com»
      $SMTPMessage.Subject = «Daily report»

      foreach($singleAddress in $addresses) {
      $SMTPMessage.BCC.Add($singleAddress)
      }

      $Attachment = New-Object System.Net.Mail.Attachment «C:\Program Files\Tools\report\alert.png»
      $SMTPMessage.Attachments.Add($Attachment)

      $SMTPClient = New-Object System.Net.Mail.SMTPClient $SendingServer

      $Credentials = new-object System.Net.networkCredential
      $Credentials.domain = «DOMAIN»
      $Credentials.UserName = «noreply»
      $Credentials.Password = «P@$$W0rd»
      $SMTPClient.Credentials = $Credentials

      $SMTPClient.Send($SMTPMessage)
      }

      #
      send-notify «< user1@domain.com >;< user2@domain.com >»

        Цитировать

  • 12# kkvkkv (75 комм.):

    и еще вопрос.
    а если я настраиваю авторизацию при отправке он типа ssl тоже задействует? т.е. я через exchange смогу отпарвить его ?
    # Задаем пользователя от имени которого будет происходить отправка
    $Credentials = new-object System.Net.networkCredential
    $Credentials.domain = «DOMAIN»
    $Credentials.UserName = «user.name»
    $Credentials.Password = «P@$$W0rd»
    $smtp.Credentials = $Credentials

      Цитировать

 

Добавить комментарий

XHTML: Вы можете использовать тэги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>