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

PowerShell实现JSON数据分组后按邮箱批量发送邮件

完善邮件自动化功能的思路与实现建议

你已经完成了核心的数据分组步骤,接下来可以从以下几个方面完善整个功能:

1. 分组内容的HTML邮件拼接

针对每个邮箱分组,需要把多条记录的对应字段合并成易读的HTML内容,避免重复发送邮件。可以直接遍历分组内的对象,拼接字段内容:

# 读取并转换JSON数据
$json = Get-Content -Raw -Path .\filename.json | ConvertFrom-Json

# 只筛选非空邮箱的条目并分组
$validGroups = $json.Data | Where-Object { !([string]::IsNullOrEmpty($_.TestValue3)) } | Group-Object -Property TestValue3

foreach ($group in $validGroups) {
    $targetEmail = $group.Name
    
    # 把同邮箱的多个字段值拼接成带列表的HTML内容
    $codeItems = $group.Group.TestValue1 | ForEach-Object { "<li>$_</li>" } -join ''
    $testValueItems = $group.Group.TestValue2 | ForEach-Object { "<li>$_</li>" } -join ''
    $accountItems = $group.Group.TestValue4 | ForEach-Object { "<li>$_</li>" } -join ''
    
    # 构建格式化的HTML邮件正文
    $mailBody = @"
<h2>用户详情</h2>
<p><strong>Codes Are:</strong></p>
<ul>$codeItems</ul>
<p><strong>Test Value Are:</strong></p>
<ul>$testValueItems</ul>
<p><strong>Accounts Are:</strong></p>
<ul>$accountItems</ul>
"@
    # 后续添加邮件发送逻辑
}

2. 邮件发送的具体实现

使用PowerShell内置的Send-MailMessage cmdlet完成邮件发送,注意配置正确的SMTP参数。如果需要批量发送,建议提前配置SMTP凭据和服务器信息:

# 配置SMTP参数
$smtpConfig = @{
    SmtpServer = "smtp.yourdomain.com"
    Port       = 587
    UseSsl     = $true
    Credential = Get-Credential -Message "输入SMTP账号密码"
    From       = "automation-notify@yourdomain.com"
    Subject    = "专属用户详情通知"
}

# 在分组循环内添加发送逻辑
foreach ($group in $validGroups) {
    # ... 前面的内容拼接代码 ...
    
    try {
        Send-MailMessage @smtpConfig -To $targetEmail -Body $mailBody -BodyAsHtml
        Write-Host "邮件已成功发送到: $targetEmail"
    }
    catch {
        Write-Error "发送邮件到 $targetEmail 失败: $_"
    }
}

3. 错误处理与日志记录

为了排查问题,建议添加日志记录,同时处理空邮箱、发送失败等异常情况:

# 初始化日志文件路径
$successLog = ".\mail-success-log.txt"
$errorLog = ".\mail-error-log.txt"
$invalidDataLog = ".\invalid-data-log.txt"

# 记录空邮箱的无效数据
$json.Data | Where-Object { [string]::IsNullOrEmpty($_.TestValue3) } | ForEach-Object {
    $logEntry = "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] 无效条目: TestValue1=$($_.TestValue1), TestValue2=$($_.TestValue2), TestValue4=$($_.TestValue4) (无邮箱地址)"
    $logEntry | Out-File -Path $invalidDataLog -Append
    Write-Warning $logEntry
}

foreach ($group in $validGroups) {
    # ... 内容拼接代码 ...
    
    try {
        Send-MailMessage @smtpConfig -To $targetEmail -Body $mailBody -BodyAsHtml
        $successEntry = "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] 成功发送到: $targetEmail"
        $successEntry | Out-File -Path $successLog -Append
        Write-Host $successEntry
    }
    catch {
        $errorEntry = "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] 发送失败到 $targetEmail : $($_.Exception.Message)"
        $errorEntry | Out-File -Path $errorLog -Append
        Write-Error $errorEntry
    }
}

4. 可选优化点

  • 使用Microsoft Graph API替代Send-MailMessage:如果你的环境是Office 365,Graph API比传统SMTP更稳定,且支持现代认证,避免SMTP端口被限制的问题。
  • 邮件内容美化:可以添加CSS样式让HTML邮件更美观,比如设置字体、间距,或者添加公司logo。
  • 批量发送限速:如果邮箱数量较多,建议添加Start-Sleep -Seconds 2之类的延迟,避免被邮件服务器判定为垃圾邮件。
  • 参数化配置:把JSON路径、SMTP信息、邮件主题等做成脚本参数,方便在不同环境下复用,比如:
    param(
        [Parameter(Mandatory=$true)]
        [string]$JsonPath,
        [string]$SmtpServer = "smtp.yourdomain.com",
        [string]$FromEmail = "automation-notify@yourdomain.com"
    )
    

内容的提问来源于stack exchange,提问作者TechSavvy8102

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 02:20:55