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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 03:10:30