Powershell – Отправка отчетов.
- Вы не любите powershell? Да вы просто не умеете его готовить!
Речь сегодня пойдет о методиках отправки файлов отчетов средствами powershell.
Имея в руках такой инструмент как powershell мы можем отправлять что угодно двумя вариантами.
- анонимная отсылка сообщений
- авторизованная отправка
Традиционные примеры в виде двух скриптов, код которых по мере возможности прокомментирован.
Скрипт №1
Анонимная отправка сообщения.
# Если ее содержимое вам не нужно то раскомментируйте следующую строку
# 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)
Стоит сказать что в случае если вам необходим набор отчетов то вы просто добавляете
Не забываете его сформировать а затем прописать тут
Скрипт №2
В случае если необходима авторизованная отправка синтаксис немного меняется, но суть остается прежней.
- отчет можно выдергивать из заранее сформированного файла
- в переменную $mail.Body можно направлять вывод любой команды.
$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. |
А также бесплатно подписаться по E-mail и получать актуальную информацию в числе первых.
Вы можете оставить комментарий.
я сейчас пытаюсь отправить почту через скрипт .. и хочу сделать так. чтобы сам отчет был в теле письма
скармливаю переменной $mail.Body = get-content $file , далее проверяю его $mail.Body оно нормально отображается построчно. когда отправляю себе письмо. то тело письма все делает в одну строку. как побороть можно?
kkvkkvЦитировать
$mail.Body = Get-Content filename.txt | ConvertTo-Html
adminЦитировать
забыл добавить…
$mail.IsBodyHtml = $true
adminЦитировать
я когда делаю $BodyText = get-content C:\ReportVM\Backuplog_2010122_171344.txt | ConvertTo-Html
то у меня вообще получается что-то странное выдается когда делаю вывод $BodyText
kkvkkvЦитировать
добавляли вот это?
$mail.IsBodyHtml = $true
adminЦитировать
проблема в самом формировании HTML
мне требовалось просто перевести TXT -> HTML
пришлось вот так сделать
$StringsFile = get-content $BackuplogPath
$OutStrings = «»
foreach($StringsFile1 in $StringsFile){ $OutStrings = $OutStrings + $StringsFile1 + «» }
$OutStrings = $OutStrings + «»
можно и красивее, но как то так
kkvkkvЦитировать
Действительно в формировании HTML есть определенные косяки, иногда проходит иногда нет.
Предложенный вами способ тоже заслуживает внимания.
adminЦитировать
он порезал
$OutStrings = «(html)(body)»
$OutStrings = OutStrings + «(/html)(/body)»
kkvkkvЦитировать
у меня замечательно пашет вот такая конструкция.
правда приходится сначала формировать 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 >»
adminЦитировать
и еще вопрос.
а если я настраиваю авторизацию при отправке он типа ssl тоже задействует? т.е. я через exchange смогу отпарвить его ?
# Задаем пользователя от имени которого будет происходить отправка
$Credentials = new-object System.Net.networkCredential
$Credentials.domain = «DOMAIN»
$Credentials.UserName = «user.name»
$Credentials.Password = «P@$$W0rd»
$smtp.Credentials = $Credentials
kkvkkvЦитировать
не пробовал отправку с SSL. просто не было задачи.
adminЦитировать