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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 13:06:21