Я работал над сценарием Powershell, который генерирует электронную почту события резервного копирования Windows. Проблема в том, что форматирование выглядит плохо.
Subject: Computer name status [backup was successful] Tuesday, December 29, 2015 2:55 AM Index : 19160 EntryType : Warning InstanceId : 4099 Message : Backup was cancelled. Category : (0) CategoryNumber : 0 ReplacementStrings : {} Source : Windows Backup TimeGenerated : 29-Dec-15 12:42:35 PM TimeWritten : 29-Dec-15 12:42:35 PM UserName :
Хотелось бы иметь красочный HTML-отчет.
Вот сценарий
$Event = Get-eventlog -log application -Newest 1 -source "Windows Backup"
$Status= $Event.Message
$From = "email@email.com"
$To = "email@email.com"
$SMTPServer = "smtp"
$SMTPPort = "port"
$Username = "email"
$Password = "***"
$Subject = "$computer, $status"
$Body = $event | format-list | out-string
$smtp = New-Object System.Net.Mail.SmtpClient($SMTPServer, $SMTPPort);
$smtp.EnableSSL = $false
$smtp.Credentials = New-Object System.Net.NetworkCredential($Username, $Password);
$smtp.Send($From, $To, $subject, $body);
$computer = "$env:computername"
Ключевое изменение, которое вы захотите сделать, - это преобразование объекта в строку. Прямо сейчас вы используете format-list
где вы захотите использовать другой конвертер, например, FormatTo-HTML
командлет. Вот техническая статья о FormatTo-HTML и некоторая документация по FormatTo-HTML с ss64.com
Вы можете ссылаться на файл css с помощью -cssuri
, но это только ссылка, поэтому использовать локальный файл не особо полезно. Вместо этого вы можете включить html <style/>
элемент в строке, переданной в -head
флаг.
FormatTo-HTML имеет свои ограничения, например, не создает чередующихся стилей строк для окраски, но может подойти для ваших нужд.
Дополнительно вам необходимо установить IsBodyHTML
свойство в сообщении. Для этого вам нужно создать объект MailMessage вместо использования System.Net.Mail.SmtpClient::Send
чтобы создать его для вас. Например:
$mailMsg = new-object System.Net.Mail.MailMessage $From $To
$mailMsg.Subject = "$computer, $status"
$mailMsg.IsBodyHTML = $true
$mailMsg.Body = $event | FormatTo-HTML -title "System Status for $computer" | out-string
$smtp.Send($mailMsg)