PowerShell脚本读取事件日志发邮件,邮件正文为空求原因排查
排查PowerShell邮件无正文问题的思路和修复方案
嘿,我来帮你搞定这个邮件没正文的问题!结合你给出的脚本片段,咱们一步步排查可能的原因:
1. 先确认事件日志查询是否返回数据
邮件没正文最常见的原因就是你要发送的事件数据是空的,先单独验证这部分:
$computers = Get-Content "C:\Source\MorningCheck.txt" foreach ($computer in $computers) { # 注意:Get-WinEvent的Level参数对应关系是1=Critical,2=Error,3=Warning # 如果要Error+Warning,应该写Level=2,3,别写错了! $events = Get-WinEvent -ComputerName $computer -FilterHashtable @{LogName='System'; Level=2,3} -ErrorAction SilentlyContinue Write-Host "从服务器 $computer 拿到了 $($events.Count) 条Error/Warning事件" }
如果输出的计数是0,说明要么目标服务器没有符合条件的事件,要么你的查询参数(比如LogName、Level)写错了,先把这部分搞定。
2. 检查HTML内容的生成是否完整
你用到了HTML样式,要确保:
- 样式标签是闭合的(你的脚本片段里
$style的拼接好像没写完,一定要加</style>) - 事件数据正确转换成了HTML表格,并且转成了字符串(
ConvertTo-Html返回的是字符串数组,直接用会有问题)
修复后的HTML生成代码示例:
# 补全样式并闭合标签 $style = "<style>BODY{font-family: Arial; font-size: 10pt;}" $style += "TABLE{border: 1px solid black; border-collapse: collapse;}" $style += "TH{border: 1px solid black; background: #dddddd; padding: 5px;}" $style += "TD{border: 1px solid black; padding: 5px;}" $style += "</style>" # 把事件转换成HTML并合并成完整字符串 $htmlContent = @() foreach ($computer in $computers) { $events = Get-WinEvent -ComputerName $computer -FilterHashtable @{LogName='System'; Level=2,3} -ErrorAction SilentlyContinue if ($events) { $htmlContent += "<h3>服务器 $computer 的事件日志</h3>" $htmlContent += $events | ConvertTo-Html -Property TimeCreated, Id, LevelDisplayName, Message -Head $style | Select-Object -Skip 7 # 跳过ConvertTo-Html自动生成的<html><head>等标签,因为我们已经自定义了样式 } else { $htmlContent += "<h3>服务器 $computer 没有找到Error/Warning事件</h3>" } } # 合并成完整的HTML正文 $finalBody = $htmlContent -join "`n" # 可以先打印看看内容 Write-Host $finalBody
3. 确保邮件发送命令的参数正确
发送邮件时必须加-BodyAsHtml参数,不然邮件客户端会把HTML代码当成纯文本,甚至因为格式问题不显示内容:
Send-MailMessage -SmtpServer $smtpServer ` -From $smtpFrom ` -To $smtpTo ` -Subject "每日系统事件检查报告" ` -Body $finalBody ` -BodyAsHtml
4. 额外排查点
- 有没有权限问题?比如运行脚本的账号能不能访问远程服务器的事件日志?可以加
-ErrorAction Stop看看有没有报错 - 邮件服务器有没有过滤空内容或者异常HTML?可以先手动发送一个简单的HTML邮件测试:
Send-MailMessage -SmtpServer $smtpServer -From $smtpFrom -To $smtpTo -Subject "测试" -Body "<h1>测试内容</h1>" -BodyAsHtml
内容的提问来源于stack exchange,提问作者Chuck
相关产品推荐
相关产品推荐

