PowerShell实现按CSV过期密钥/证书数据分组发送所有者通知邮件
过期应用密钥所有者通知PowerShell脚本
核心功能
- 读取存储过期密钥/证书记录的CSV文件,按规则匹配字段:A列应用名称、B列应用ID、I列过期时长、J列所有者邮箱
- 自动按所有者邮箱分组,合并同一用户名下的多条过期记录,避免重复发信
- 针对每个所有者动态生成汇总邮件正文,单封邮件列明其名下所有过期应用的名称、ID、过期天数
- 保留原邮件发送框架的SSL加密、身份认证、附件携带能力,支持调试模式先预览不实际发信
完整可运行脚本
# -------------------------- 配置区 请根据实际环境修改 -------------------------- $CsvPath = "C:\Users\<你的用户名>\Desktop\AllExpired.csv" # 过期记录CSV文件路径 $From = "MyEmail@org.com" # 发件人邮箱 $Cc = "BossEmail@org.com" # 抄送邮箱 $Attachment = $CsvPath # 附件携带全量过期记录CSV $Subject = "Expired App Registration" # 邮件主题 $SMTPServer = "blank.org.com" # SMTP服务器地址 $SMTPPort = 587 # SMTP端口,常用值为587/25/465,按实际环境调整 $EnableTestMode = $true # 测试模式:$true仅控制台输出邮件内容不实际发送,$false正式发信 # ----------------------------------------------------------------------------- # 导入CSV数据,自动跳过空行 $allExpiredRecords = Import-Csv -Path $CsvPath # 过滤掉所有者邮箱为空的无效记录 $validRecords = $allExpiredRecords | Where-Object { $_.PSObject.Properties.Value[9] -notmatch '^\s*$' } # 按J列(数组索引9,对应所有者邮箱)分组聚合记录 $groupedByOwner = $validRecords | Group-Object -Property { $_.PSObject.Properties.Value[9] } # 遍历每个所有者分组生成邮件并发送 foreach ($ownerGroup in $groupedByOwner) { $ownerEmail = $ownerGroup.Name $ownerApps = $ownerGroup.Group # 提取当前所有者名下所有应用的名称、ID、过期时长 $appNames = @() $appIds = @() $expiredDays = @() foreach ($app in $ownerApps) { $appNames += $app.PSObject.Properties.Value[0] # A列 索引0 应用名称 $appIds += $app.PSObject.Properties.Value[1] # B列 索引1 应用ID $expiredDays += $app.PSObject.Properties.Value[8] # I列 索引8 过期时长 } # 拼接中文邮件正文 $body = @" 您好,您为以下应用的登记所有者:应用名$($appNames -join '、'),对应ApplicationID为$($appIds -join '、'),相关密钥已分别过期$($expiredDays -join '天、')天,请告知相关应用是否仍在使用或可予以移除,谢谢。 "@ # 测试模式下输出预览内容 if ($EnableTestMode) { Write-Host "`n================ 待发送邮件预览 ================" Write-Host "From: $From" Write-Host "To: $ownerEmail" Write-Host "Cc: $Cc" Write-Host "Subject: $Subject" Write-Host "正文:`n$body`n" continue } # 正式发送邮件 Send-MailMessage -From $From -To $ownerEmail -Cc $Cc -Subject $Subject ` -Body $body -SmtpServer $SMTPServer -Port $SMTPPort -UseSsl ` -Credential (Get-Credential) -Attachments $Attachment -Encoding UTF8 }
使用注意事项
- 首次使用请保持
$EnableTestMode为$true,运行脚本确认控制台输出的收件人、正文内容无误后,再改为$false正式发信 - 如果CSV文件自带明确表头(比如J列表头为
OwnerEmail、I列表头为ExpiredDays),可以把脚本里按索引取值的部分替换为按表头名取值,例如$app.OwnerEmail,可读性更强 - 脚本默认使用UTF8编码发送正文,避免中文乱码
- 运行脚本弹出凭据认证窗口时,请输入发件人邮箱对应的账号密码,部分企业邮箱需要输入专用应用密码
内容的提问来源于stack exchange,提问作者help
相关产品推荐
相关产品推荐

