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
相关产品推荐
相关产品推荐

