PowerShell邮件追踪需求:仅筛选外部收件人超2人的外发邮件
筛选外部收件人数量超过2人的外发邮件
原命令的问题在于,Get-MessageTrace会为邮件的每个收件人生成一条独立记录,直接过滤单个收件人是否为外部,会返回所有含外部收件人的单条记录,无法统计同一邮件的外部收件总数。
解决思路是先按邮件唯一标识MessageTraceId分组,统计每组中外部收件人的数量,再筛选出数量大于2的邮件:
# 1. 获取符合条件的外部收件人记录,按MessageTraceId分组并统计数量 $externalGroups = Get-MessageTrace -StartDate (Get-Date).AddDays(-10) -EndDate (Get-Date) -Status Delivered | Where-Object { $_.RecipientAddress -notmatch "@myorganisation.fr|@toto.fr" } | Group-Object -Property MessageTraceId | Where-Object { $_.Count -gt 2 } # 2. 根据筛选出的MessageTraceId,获取完整的邮件追踪信息 Get-MessageTrace -StartDate (Get-Date).AddDays(-10) -EndDate (Get-Date) -Status Delivered | Where-Object { $externalGroups.Name -contains $_.MessageTraceId }
如果只需要输出邮件的关键信息(比如发件人、外部收件人列表、邮件主题),可以直接在分组后处理:
Get-MessageTrace -StartDate (Get-Date).AddDays(-10) -EndDate (Get-Date) -Status Delivered | Where-Object { $_.RecipientAddress -notmatch "@myorganisation.fr|@toto.fr" } | Group-Object -Property MessageTraceId | Where-Object { $_.Count -gt 2 } | ForEach-Object { [PSCustomObject]@{ MessageTraceId = $_.Name SenderAddress = $_.Group[0].SenderAddress Subject = $_.Group[0].Subject ExternalRecipients = $_.Group.RecipientAddress -join ';' RecipientCount = $_.Count } }
关键说明
- 使用
Group-Object按MessageTraceId分组,同一邮件的所有外部收件人记录会被归为一组 - 通过
$_.Count判断该组的外部收件人数量,筛选出大于2的分组 - 若需要完整的邮件追踪数据,可再次调用
Get-MessageTrace并匹配筛选出的MessageTraceId
内容的提问来源于stack exchange,提问作者azalee78
相关产品推荐
相关产品推荐

