PowerShell脚本发送多份HTML报告:免责声明嵌入第一份报告表格问题
问题根源
直接拼接两个完整HTML文件会导致DOM结构混乱——每份报告都包含独立的<html>、<head>、<body>标签,拼接后形成不符合规范的重复/嵌套结构,邮件客户端解析时出现布局错乱,最终把公司免责声明错误嵌入到第一份报告的表格中。
修复方案
需要提取两份HTML的正文内容(即<body>标签内的部分),再重新组装成标准的HTML结构,避免解析异常。
方案1:提取正文内容并重构HTML
# 定义报告路径 $report1Path = "C:\Reports\ADReport16.htm" $report2Path = "C:\Reports\ADReport26.htm" # 编写函数提取HTML的<body>内部内容 function Get-HtmlBodyContent { param([string]$FilePath) $rawContent = Get-Content $FilePath -Raw # 用正则匹配<body>标签内的所有内容 if ($rawContent -match '<body[^>]*>([\s\S]*?)</body>') { return $matches[1] } return $rawContent # 未匹配到<body>时返回原内容 } # 获取两份报告的正文部分 $bodySection1 = Get-HtmlBodyContent -FilePath $report1Path $bodySection2 = Get-HtmlBodyContent -FilePath $report2Path # 组装成标准HTML结构,可添加统一样式和分隔线 $finalHtmlBody = @" <html> <head> <title>Active Directory Health Report</title> <style> table { border-collapse: collapse; margin: 16px 0; width: 100%; } th, td { border: 1px solid #ddd; padding: 8px; text-align: left; } hr { border: none; border-top: 1px solid #eee; margin: 24px 0; } </style> </head> <body> $bodySection1 <hr> $bodySection2 </body> </html> "@ # 发送邮件 Send-MailMessage -SmtpServer '10.10.10.10' -From 'AD.REPORT@microsoft.com' -To 'xxx.zzz@cisco.net' -Subject "Active Directory Health Report" -Body $finalHtmlBody -BodyAsHtml
方案2:简化拼接(仅适用于报告为无完整结构的HTML片段)
如果两份报告本身只是<table>这类独立片段,直接拼接时添加分隔元素即可:
$report = "C:\Reports\ADReport16.htm" $report1 = "C:\Reports\ADReport26.htm" $BodyReport1 = Get-Content "$report" -Raw $BodyReport2 = Get-Content "$report1" -Raw # 用<hr>分隔两份报告,避免解析混淆 $finalBody = "$BodyReport1 <hr> $BodyReport2" Send-MailMessage -SmtpServer '10.10.10.10' -From 'AD.REPORT@microsoft.com' -To 'xxx.zzz@cisco.net' -Subject "Active Directory Health Report" -Body $finalBody -BodyAsHtml
核心注意事项
- 必须保证最终HTML结构符合标准,禁止重复出现
<html>或<body>标签 - 添加分隔元素(如
<hr>)既可以明确两份报告的边界,也能防止邮件客户端错误合并内容 - 标准结构会让邮件服务器自动添加的免责声明被正确放置在邮件末尾,而非嵌入报告内容中
内容的提问来源于stack exchange,提问作者Som S
相关产品推荐
相关产品推荐

