背景

公司里经常有同学发错了邮件需要撤回,最近两周就有两个典型案例,都是错发到多层嵌套邮件组里。通常大的邮件组可能会层层嵌套多个小邮件组。而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。

看一下脚本执行结果:

image.png