背景
公司里经常有同学发错了邮件需要撤回,最近两周就有两个典型案例,都是错发到多层嵌套邮件组里。通常大的邮件组可能会层层嵌套多个小邮件组。而Exchange本身只提供了查看邮件组直接成员的命令,对于嵌套组的成员没办法直接查看。 这就导致类似场景没办法将多层嵌套的用户邮件进行删除。
常规处理方式
一直以来,IT对不同场景下,删除邮件的手段如下:
全员邮件,比如通告通知类的,直接遍历公司所有邮箱进行删除。 层层嵌套多层邮件组,直接遍历公司所有邮箱进行删除。 单个邮件组无嵌套或者嵌套简单,逐一对几个组进行遍历删除。 但是,对于多层嵌套邮件组来讲,遍历全员邮箱是多余的,效率也低。
使用递归脚本遍历
Add-PSSnapin microsoft.exchange*
$group = "mtt"
$lists = New-Object -TypeName System.Collections.ArrayList
$lists.Add($group)
Function Get-RecureGroup(){
$temp = (Get-DistributionGroupMember -Identity $group | ? {$_.RecipientType -eq "MailUniversalDistributionGroup"}).Name
# Write-Output "$temp"
if($temp.Length -gt 0){
Foreach($i in $temp){
if ($lists -notcontains $i){
$lists.Add($i)
$group = $i
Get-RecureGroup
}
}
}
}
Get-RecureGroup
Write-Output "$lists"
Function Delete-Email(){
Foreach($dl in $lists){
Get-DistributionGroupMember $dl | ? {$_.RecipientType -eq "UserMailbox"} | Get-Mailbox |Search-Mailbox -SearchQuery 'From:VDIDirectorMointor@immomo.com' -EstimateResultOnly
}
}
Delete-Email
-EstimateResultOnly 参数只是返回搜索结果(可用于预览每个邮箱中匹配的邮件数量),并不执行删除,删除参数为 -DeleteContent。
看一下脚本执行结果: