如何用PowerShell将含标签节点的完整XML嵌入邮件正文?
解决PowerShell邮件正文展示完整XML内容的问题
纯文本邮件方案
如果用纯文本格式发送邮件,直接读取XML文件的原始内容作为正文即可,不要将XML解析为对象后再转字符串(这会破坏标签结构)。
示例脚本:
# 读取XML文件的原始内容(-Raw参数确保保留完整格式) $xmlContent = Get-Content -Path "C:\your\file\path.xml" -Raw # 发送纯文本邮件 Send-MailMessage -From "sender@domain.com" -To "recipient@domain.com" ` -Subject "XML Content (Plain Text)" -Body $xmlContent ` -SmtpServer "smtp.yourserver.com"
HTML邮件方案
如果需要HTML格式邮件,XML标签会被HTML解析引擎误判为HTML标签,必须对XML内容做HTML转义,再用<pre>标签包裹以保留原始格式。
方法1:用.NET内置工具转义
# 加载System.Web程序集(PowerShell 5+默认已加载) Add-Type -AssemblyName System.Web # 读取XML原始内容 $xmlContent = Get-Content -Path "C:\your\file\path.xml" -Raw # 转义HTML特殊字符(<、>、&等) $escapedXml = [System.Web.HttpUtility]::HtmlEncode($xmlContent) # 构建HTML正文,<pre>标签保留换行和缩进 $htmlBody = "<pre>$escapedXml</pre>" # 发送HTML邮件(需启用BodyAsHtml参数) Send-MailMessage -From "sender@domain.com" -To "recipient@domain.com" ` -Subject "XML Content (HTML)" -Body $htmlBody -BodyAsHtml $true ` -SmtpServer "smtp.yourserver.com"
方法2:手动替换特殊字符(适用于无法加载System.Web的场景)
$xmlContent = Get-Content -Path "C:\your\file\path.xml" -Raw # 手动替换HTML特殊字符 $escapedXml = $xmlContent -replace '&', '&' -replace '<', '<' -replace '>', '>' -replace '"', '"' $htmlBody = "<pre>$escapedXml</pre>" Send-MailMessage -From "sender@domain.com" -To "recipient@domain.com" ` -Subject "XML Content (HTML)" -Body $htmlBody -BodyAsHtml $true ` -SmtpServer "smtp.yourserver.com"
关键注意事项
- 禁止使用
[xml]$xml = Get-Content ...后再转字符串,这种操作会将XML解析为对象,转换后丢失原始标签结构。 - HTML邮件必须转义特殊字符,否则XML标签会被当作HTML标签处理,导致内容丢失或显示异常。
<pre>标签能完整保留XML的换行、缩进格式,提升可读性。
内容的提问来源于stack exchange,提问作者dpresnell90
相关产品推荐
相关产品推荐

