You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:29:44