PowerShell实现:基于SQL查询结果的动态邮件分发
按用户拆分SQL查询结果并发送对应邮件的PowerShell实现方案
需求说明
- 已获取SQL查询结果,需按用户邮箱/姓名拆分数据
- 仅向对应用户发送其相关记录的邮件,同一用户多条记录合并为一封发送
示例数据
Handles NPM(K) PM(K) WS(K) CPU(s) email Name ---------------------------------------------------------------------- 151 11 1588 900 0.06 Jose@gmail.com jose 235 14 4024 2408 Frank@gmail.com Frank 328 17 4936 3728 Frank@gmail.com Frank 169 10 1744 3064 0.05 Maria@gmail.com Maria
现有问题
原代码仅能群发包含所有用户记录的统一邮件,无法实现按用户拆分发送专属记录的需求。
修改后的PowerShell代码
$query = [system.io.file]::ReadAllText('C:\temp\QUERY.sql') $Header = [system.io.file]::ReadAllText('C:\temp\header.txt') $mycss = [system.io.file]::ReadAllText('C:\temp\my.css') $queryresults = Invoke-Sqlcmd -query $query -ServerInstance "SQLserver" -Username $username -Password $pw | Select * -ExcludeProperty RowError, RowState, Table, ItemArray, HasErrors If ($queryresults) { # 按邮箱分组,合并同一用户的所有记录 $groupedResults = $queryresults | Group-Object -Property email $emailSmtpServer = "exhange.server.com" $emailSmtpServerPort = "25" $emailSmtpUser = $useremail $emailSmtpPass = $userpw $emailFrom = "jose@gmail.com" # 遍历每个用户分组,发送专属邮件 foreach ($group in $groupedResults) { $userEmail = $group.Name $userRecords = $group.Group # 生成该用户专属的HTML报告 $userReport = $userRecords | ConvertTo-Html -Head $Header | Out-String # 创建并配置邮件 $emailMessage = New-Object System.Net.Mail.MailMessage($emailFrom, $userEmail) $emailMessage.Subject = "你的专属记录报告" $emailMessage.IsBodyHtml = $true $emailMessage.Body = "<p>以下是你的相关记录:<br><br></p>" + $userReport # 发送邮件并清理资源 $SMTPClient = New-Object System.Net.Mail.SmtpClient($emailSmtpServer, $emailSmtpServerPort) $SMTPClient.EnableSsl = $False $SMTPClient.Credentials = New-Object System.Net.NetworkCredential($emailSmtpUser, $emailSmtpPass) $SMTPClient.Send($emailMessage) $emailMessage.Dispose() $SMTPClient.Dispose() } } else { Exit }
核心修改说明
- 使用
Group-Object -Property email按邮箱对查询结果分组,确保同一用户的所有记录被归类到同一组 - 遍历每个用户分组,动态生成仅包含该用户记录的HTML报告
- 邮件收件人设置为当前分组的邮箱地址,实现定向发送
- 新增资源清理步骤,避免未释放的对象占用系统资源
内容的提问来源于stack exchange,提问作者user2654626
相关产品推荐
相关产品推荐

