我一直在编写一个 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 protected]"
$To = "[email protected]"
$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"
答案1
您要进行的关键更改是在对象到字符串的转换过程中。现在,您正在使用format-list
您想要使用其他转换器的地方,例如 cmdlet FormatTo-HTML
。这是一个有关 FormatTo-HTML 的 technet 文章以及一些相关文献来自 ss64.com 的 FormatTo-HTML
您可以使用 引用 css 文件-cssuri
,但这仅作为链接包含,因此使用本地文件不是特别有用。相反,您可以<style/>
在传递给标志的字符串中包含 html 元素-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)