使用PowerShell Send-MailMessage发送AD查询结果邮件格式异常如何解决
问题根因
- 代码同时使用了纯文本格式化逻辑和HTML邮件参数:
Format-Table+Out-String生成的是控制台适配的纯文本内容,加上-BodyAsHtml参数后,HTML渲染会自动合并所有换行、连续空格,导致纯文本表格结构被打散,所有内容挤压到一起。 - 冗余查询逻辑:
Get-ADUser使用-Properties *会拉取用户所有AD属性,大幅降低查询效率,仅需指定你需要用到的属性即可。
修复方案
有两种可选实现,按需选用:
方案1:发送带美观表格的HTML格式邮件(推荐)
直接将查询到的AD用户对象转为HTML表格,无需经过纯文本格式化步骤,修复后的完整代码如下:
# 服务器2012+未安装RSAT工具时可先执行下面命令安装组件 # Add-WindowsFeature RSAT-AD-PowerShell Import-Module ActiveDirectory $emailto = 'markbuehler@milgard.com' $emailfrom = 'markbuehler@milgard.com' $emailsubject = "持有有效ipPhone属性的禁用AD用户清单" $smtp_server = 'corp-smtp01.milgardwindows.com' # 仅拉取需要的属性,提升查询效率 $disabledusers = Get-ADUser -SearchBase "OU=MIMilgardUsersandComputers,DC=milgardwindows,DC=com" ` -Filter {Enabled -eq $false -and ipPhone -like "*"} ` -Properties Name,UserPrincipalName,Office,ipPhone | ` Select-Object Name,UserPrincipalName,Office,ipPhone # 生成带基础样式的HTML邮件内容 $htmlBody = $disabledusers | ConvertTo-Html -Property Name,UserPrincipalName,Office,ipPhone ` -Title $emailsubject ` -PreContent "<h3>$emailsubject</h3>" ` -PostContent "<p>统计时间:$(Get-Date -Format 'yyyy年MM月dd日 HH:mm:ss')</p>" | Out-String # 发送HTML格式邮件 Send-MailMessage -To $emailto -From $emailfrom -Subject $emailsubject -SmtpServer $smtp_server ` -Body $htmlBody -BodyAsHtml
方案2:发送纯文本格式邮件
如果不需要HTML样式,直接删除-BodyAsHtml参数即可,纯文本内容会保留原有的换行和表格缩进:
# 仅修改发送邮件的命令即可,其余逻辑不变 Send-MailMessage -To $emailto -From $emailfrom -Subject $emailsubject -SmtpServer $smtp_server ` -Body ($disabledusers | Out-String)
内容的提问来源于stack exchange,提问作者Milgard Sharepoint
相关产品推荐
相关产品推荐

