环境要求:Powershell 5.0,加域电脑

  1. 安装EWS API,安装到默认位置 https://www.microsoft.com/en-us/download/details.aspx?id=42951
  2. 权限配置,在Office365的Exchange管理中心和Exchange的管理中心,管理员角色中添加ApplicationImpersonation角色,并添加执行账号作为成员
  3. 删除邮件脚本分解 3.1使用执行账号连接EWS API
Import-Module -Name "C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll" #导入API模块
$username = "执行账号邮箱" 			
$password = "执行账号密码"
$exchService = new-object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2016_CU7) 
$ExchangeVersion = [Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2016_CU7
$service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService($ExchangeVersion)
$service.Credentials = New-Object Microsoft.Exchange.WebServices.Data.WebCredentials -ArgumentList $userName, $password

3.2指定被删除邮件的账号

$deleteusersamid = "xxxx"      #被删除邮件账号samid
$userinfo = get-aduser $deleteusersamid -Properties EmailAddress,targetAddress
$targetAddress =$userinfo.targetAddress
if($targetAddress){
#删除Office365邮箱邮件
$uri=[system.URI] "https://outlook.office365.com/EWS/Exchange.asmx"
}else{
#删除Exchange邮箱邮件
$uri=[system.URI] "https://email.localexchange.com/ews/exchange.asmx" 
}
$upn = $userinfo.EmailAddress
$service.url = $uri
$service.ImpersonatedUserId = New-Object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId ([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SMTPAddress,$upn)  

3.3指定删除邮件条件

#新建搜索逻辑集合
$sfCollection = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+SearchFilterCollection([Microsoft.Exchange.WebServices.Data.LogicalOperator]::And);
#指定开始时间
$filter1 = New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+IsGreaterThanOrEqualTo([Microsoft.Exchange.WebServices.Data.ItemSchema]::DateTimeReceived, $starttime)
$sfCollection.add($filter1)
#指定结束时间
$filter2 = New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+IsLessThanOrEqualTo([Microsoft.Exchange.WebServices.Data.ItemSchema]::DateTimeReceived, $endtime)
$sfCollection.add($filter2)
#指定邮件主题,主题模糊匹配,取主题中一段内容也可以,内容不要包含特殊符合
$filter3 = New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+ContainsSubstring([Microsoft.Exchange.WebServices.Data.ItemSchema]::Subject,$subject)
$sfCollection.add($filter3)
#指定发件地址
$filter4 = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo([Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::Sender, $Sender)  
$sfCollection.add($filter4)
#指定正文内容,正文模糊匹配,取正文中一段内容也可以,内容不要包含特殊符合
$filter5 = New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+ContainsSubstring([Microsoft.Exchange.WebServices.Data.ItemSchema]::Body,$Body)
$sfCollection.add($filter5)
#指定一次最多读取的邮件数量
$view = New-Object Microsoft.Exchange.WebServices.Data.ItemView(1000)
#指定一次最多读取的文件夹数量
$FolderList = new-object Microsoft.Exchange.WebServices.Data.FolderView(100)

3.4在收件箱,已发送邮件,已删除邮件搜索邮件

#在收件箱搜索邮件,不包含子文件夹
$mails = $service.FindItems([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::inbox,$sfCollection,$view)
#在已发送邮件搜索邮件
$mails = $service.FindItems([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::SentItems,$sfCollection,$view)
#在已删除邮件搜索邮件
$mails = $service.FindItems([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::DeletedItems,$sfCollection,$view)

3.5在收件箱的子文件夹中搜索邮件

#获取收件箱所有文件夹
$inbox = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,[Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox)
$FolderList = new-object Microsoft.Exchange.WebServices.Data.FolderView(100)
$FolderList.Traversal = [Microsoft.Exchange.WebServices.Data.FolderTraversal]::Deep
$findFolderResults = $inbox.FindFolders($FolderList)
$sortfindFolderResults = $findFolderResults | where{$_.FolderClass -eq "IPF.Note"}  
#在每个子文件夹搜索邮件
foreach($subfoler in $sortfindFolderResults){
$displayname = $subfoler.displayname
$echocontent = "正在查询$upn 文件夹$displayname 中的邮件"
Write-Host $echocontent -ForegroundColor gray
$id = $subfoler.id
$folder_ms= ""
$folder_ms= [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,$id)
$mails = ""
$mails= $service.FindItems($id,$sfCollection,$view)
if($mails){
$findResults += $mails
}
}

3.6删除所有搜索到的邮件,删除类型可选值如下: MoveToDeletedItems:邮件移动到已删除邮件夹 Softdelete:软删除,在恢复已删除邮件中可以恢复 harddelete:硬删除,永久删除,无法恢复

foreach($item in $findResults){
$item.Delete([Microsoft.Exchange.WebServices.Data.DeleteMode]::softdelete) 
}

4.删除邮件函数

function EWSDeleteEmail
{
<#
.SYNOPSIS
删除指定邮件内容
EWSDeleteEmail -recepient extest7 -sender user@domain.cn -starttime "2018.12.24 10:48" -endtime "2018.12.24 10:51" -subject "234" -Confirm:$false
#>
 [CmdletBinding(
    SupportsShouldProcess = $true,
    ConfirmImpact = 'High')]
	param
(
        [Parameter(Mandatory=$true)]
		$sender,
        [Parameter(Mandatory=$true)]
		$subject,
        [Parameter(Mandatory=$true)]		
		[System.datetime]$starttime ,
        [Parameter(Mandatory=$true)]		
		[System.datetime]$endtime ,
        [Parameter(Mandatory=$false)]
		$recepient
)
if($PSCmdlet.ShouldProcess($param)) {
if($recepient -or ($file -match ".csv")){
if($endtime -gt $starttime){
if($subject){
if($sender -match "\@"){
$result = @()
Import-Module -Name "C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll"
$username = "user@domain.com" 			
$password = "Password" 
$exchService = new-object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2016_CU7) 
$ExchangeVersion = [Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2016_CU7
$service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService($ExchangeVersion)
$service.Credentials = New-Object Microsoft.Exchange.WebServices.Data.WebCredentials -ArgumentList $userName, $password
$filter1 = New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+IsGreaterThanOrEqualTo([Microsoft.Exchange.WebServices.Data.ItemSchema]::DateTimeReceived, $starttime)
$filter2 = New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+IsLessThanOrEqualTo([Microsoft.Exchange.WebServices.Data.ItemSchema]::DateTimeReceived, $endtime)
$filter3 = New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+ContainsSubstring([Microsoft.Exchange.WebServices.Data.ItemSchema]::Subject,$subject)
$filter4 = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo([Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::Sender, $Sender)  
$sfCollection = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+SearchFilterCollection([Microsoft.Exchange.WebServices.Data.LogicalOperator]::And);
$sfCollection.add($filter1)
$sfCollection.add($filter2)
$sfCollection.add($filter3)
$sfCollection.add($filter4)
if($recepient){
$recsamid = ($recepient -split "\@")[0]
$userinfo = ""
$userinfo = get-aduser $recsamid -Properties EmailAddress,targetAddress
$useremail = ""
$useremail = $userinfo.EmailAddress
if($useremail){
$targetAddress = ""
$targetAddress =$userinfo.targetAddress
if($targetAddress){
$uri=[system.URI] "https://outlook.office365.com/EWS/Exchange.asmx"
}else{
$uri=[system.URI] "https://email.domain.com/ews/exchange.asmx" 
}
$upn = $userinfo.EmailAddress
$service.url = $uri
$service.ImpersonatedUserId = New-Object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId ([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SMTPAddress,$upn)
$inbox = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,[Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox)
$FolderList = new-object Microsoft.Exchange.WebServices.Data.FolderView(100)
$FolderList.Traversal = [Microsoft.Exchange.WebServices.Data.FolderTraversal]::Deep
$findFolderResults = $inbox.FindFolders($FolderList)
$view = New-Object Microsoft.Exchange.WebServices.Data.ItemView(1000)
$findResults = @()
$mails = ""
$echocontent = "正在查询$upn 收件箱中的邮件"
Write-Host $echocontent -ForegroundColor gray
$mails = $service.FindItems([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::inbox,$sfCollection,$view)
$mails | Add-Member -MemberType NoteProperty -Name foldername -Value "inbox"
if($mails){
$findResults += $mails
}
$mails = ""
$mails = $service.FindItems([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::SentItems,$sfCollection,$view)
$mails | Add-Member -MemberType NoteProperty -Name foldername -Value "SentItems"
if($mails){
$findResults += $mails
}
$mails = ""
$mails = $service.FindItems([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::DeletedItems,$sfCollection,$view)
$mails | Add-Member -MemberType NoteProperty -Name foldername -Value "DeletedItems"
if($mails){
$findResults += $mails
}
if(!$findResults){
$sortfindFolderResults = $findFolderResults | where{$_.FolderClass -eq "IPF.Note"}
foreach($subfoler in $sortfindFolderResults){
$displayname = $subfoler.displayname
$echocontent = "正在查询$upn 文件夹$displayname 中的邮件"
Write-Host $echocontent -ForegroundColor gray
$id = $subfoler.id
$folder_ms= ""
$folder_ms= [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,$id)
$mails = ""
$mails= $service.FindItems($id,$sfCollection,$view)
if($mails){
$mails | Add-Member -MemberType NoteProperty -Name foldername -Value $displayname
$findResults += $mails
}
}
}
if($findResults){
$num = ($findResults | measure).count
$outinfo = $findResults | select DateTimeReceived,Sender,Subject,Size,foldername
$outinfotxt = $outinfo | fl | Out-String
$echocontent = @"
查询条件:
收件人:$upn
发件人:$Sender
主题:$subject
时间段:$starttime-$endtime
搜索结果数量:$num
具体信息:$outinfotxt
"@
Write-Host $echocontent -ForegroundColor gray
foreach($item in $findResults){
$Error.Clear()
$item.Delete([Microsoft.Exchange.WebServices.Data.DeleteMode]::softdelete) 
if($Error){
$Errortxt = $Error | Out-String 
$item | Add-Member -MemberType NoteProperty -Name action -Value "failed"
$item | Add-Member -MemberType NoteProperty -Name errorinfo -Value $Errortxt
}else{
$item | Add-Member -MemberType NoteProperty -Name action -Value "succeed"
}
$item | Add-Member -MemberType NoteProperty -Name searchuser -Value $recsamid
$newitem = $item | select searchuser,DateTimeReceived,Sender,Subject,Size,foldername,action,errorinfo
$result += $newitem
}
}else{
$userobject = New-Object psobject -Property @{
searchuser = $recsamid
DateTimeReceived = ""
Sender= $Sender
Subject= $subject
Size= ""
foldername= ""
action= ""
errorinfo= "搜索结果为0"
}
$result += $userobject
}
}else{
$userobject = New-Object psobject -Property @{
searchuser = $recsamid
DateTimeReceived = ""
Sender= $Sender
Subject= $subject
Size= ""
foldername= ""
action= ""
errorinfo= "Not Exsit Recipent"
}
$result += $userobject
}
}
return $result
}else{
Write-Host "请输入发件人完整地址" -ForegroundColor Red
}
}else{
Write-Host "请输入邮件主题关键词" -ForegroundColor Red
}
}else{
Write-Host "starttime应小于endtime" -ForegroundColor Red
}
}else{
Write-Host "请提供收件人信息" -ForegroundColor Red
}
}
}

5.如何使用删除邮件函数 短期测试:打开Powershell,复制以上代码在Powershell运行。 使用以下命令删除邮件:

EWSDeleteEmail -sender sender@domain.com -subject "testsubject" -starttime "2020.4.24 9:50" -endtime "2020.4.24 9:55" -recepient recipient@domain.com

长期使用:建议将函数保存到Powershell 个人Profile.

#查看是否已有Profile
$profile
#创建Profile,(如上一步查看到已有Profile跳过此步)
New-Item –Path $Profile –Type File –Force
#打开Profile,将函数复制添加到最后
notepad $Profile

然后每次打开Powershell,可以直接使用EWSDeleteEmail函数。

EWSDeleteEmail -sender sender@domain.com -subject "testsubject" -starttime "2020.4.24 9:50" -endtime "2020.4.24 9:55" -recepient recipient@domain.com

6.如何批量删除邮件 6.1.准备删除邮件的名单user.csv,user.csv格式如下

email
user1@domain.com
user2@domain.com
user3@domain.com

6.2.批量运行删除邮件并保存运行结果到result.csv文件

$userlist = Import-Csv user.csv
foreach($user in $userlist){
$recepient = $user.email
$info = EWSDeleteEmail -sender sender@domain.com -subject "Test" -starttime "2020.4.24 9:50" -endtime "2020.4.24 9:55" -recepient $recepient
$info | Export-Csv result.csv -Encoding UTF8 -Append
}

7.扩展使用方式 如需要查询某个用户是否收到了邮件或者查询邮件是否已读取,可以将函数中删除邮件的部分取消,并返回搜索结果$findResults,那么就可以看到邮件相关信息,如是否已读等 7.1 读取指定邮件内容函数

function ReadSpecificEmail
{
<#
.SYNOPSIS
读取指定邮箱邮件
ReadSpecificEmail -recepient extest7 -sender user@domain.cn -starttime "2018.12.24 10:48" -endtime "2018.12.24 10:51" -subject "234" -Confirm:$false
#>
 [CmdletBinding(
    SupportsShouldProcess = $true,
    ConfirmImpact = 'High')]
	param
(
        [Parameter(Mandatory=$true)]
		$sender,
        [Parameter(Mandatory=$true)]
		$subject,
        [Parameter(Mandatory=$true)]		
		[System.datetime]$starttime ,
        [Parameter(Mandatory=$true)]		
		[System.datetime]$endtime ,
        [Parameter(Mandatory=$false)]
		$recepient
)
if($PSCmdlet.ShouldProcess($param)) {
if($recepient -or ($file -match ".csv")){
if($endtime -gt $starttime){
if($subject){
if($sender -match "\@"){
$result = @()
Import-Module -Name "C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll"
$username = "user@domain.com" 			
$password = "Password" 
$exchService = new-object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2016_CU7) 
$ExchangeVersion = [Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2016_CU7
$service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService($ExchangeVersion)
$service.Credentials = New-Object Microsoft.Exchange.WebServices.Data.WebCredentials -ArgumentList $userName, $password
$filter1 = New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+IsGreaterThanOrEqualTo([Microsoft.Exchange.WebServices.Data.ItemSchema]::DateTimeReceived, $starttime)
$filter2 = New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+IsLessThanOrEqualTo([Microsoft.Exchange.WebServices.Data.ItemSchema]::DateTimeReceived, $endtime)
$filter3 = New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+ContainsSubstring([Microsoft.Exchange.WebServices.Data.ItemSchema]::Subject,$subject)
$filter4 = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo([Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::Sender, $Sender)  
$sfCollection = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+SearchFilterCollection([Microsoft.Exchange.WebServices.Data.LogicalOperator]::And);
$sfCollection.add($filter1)
$sfCollection.add($filter2)
$sfCollection.add($filter3)
$sfCollection.add($filter4)
if($recepient){
$recsamid = ($recepient -split "\@")[0]
$userinfo = ""
$userinfo = get-aduser $recsamid -Properties EmailAddress,targetAddress
$useremail = ""
$useremail = $userinfo.EmailAddress
if($useremail){
$targetAddress = ""
$targetAddress =$userinfo.targetAddress
if($targetAddress){
$uri=[system.URI] "https://outlook.office365.com/EWS/Exchange.asmx"
}else{
$uri=[system.URI] "https://email.domain.com/ews/exchange.asmx" 
}
$upn = $userinfo.EmailAddress
$service.url = $uri
$service.ImpersonatedUserId = New-Object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId ([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SMTPAddress,$upn)
$inbox = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,[Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox)
$FolderList = new-object Microsoft.Exchange.WebServices.Data.FolderView(100)
$FolderList.Traversal = [Microsoft.Exchange.WebServices.Data.FolderTraversal]::Deep
$findFolderResults = $inbox.FindFolders($FolderList)
$view = New-Object Microsoft.Exchange.WebServices.Data.ItemView(1000)
$findResults = @()
$mails = ""
$echocontent = "正在查询$upn 收件箱中的邮件"
Write-Host $echocontent -ForegroundColor gray
$mails = $service.FindItems([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::inbox,$sfCollection,$view)
$mails | Add-Member -MemberType NoteProperty -Name foldername -Value "inbox"
if($mails){
$findResults += $mails
}
$mails = ""
$mails = $service.FindItems([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::SentItems,$sfCollection,$view)
$mails | Add-Member -MemberType NoteProperty -Name foldername -Value "SentItems"
if($mails){
$findResults += $mails
}
$mails = ""
$mails = $service.FindItems([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::DeletedItems,$sfCollection,$view)
$mails | Add-Member -MemberType NoteProperty -Name foldername -Value "DeletedItems"
if($mails){
$findResults += $mails
}
if(!$findResults){
$sortfindFolderResults = $findFolderResults | where{$_.FolderClass -eq "IPF.Note"}
foreach($subfoler in $sortfindFolderResults){
$displayname = $subfoler.displayname
$echocontent = "正在查询$upn 文件夹$displayname 中的邮件"
Write-Host $echocontent -ForegroundColor gray
$id = $subfoler.id
$folder_ms= ""
$folder_ms= [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,$id)
$mails = ""
$mails= $service.FindItems($id,$sfCollection,$view)
if($mails){
$mails | Add-Member -MemberType NoteProperty -Name foldername -Value $displayname
$findResults += $mails
}
}
}
if($findResults){
$num = ($findResults | measure).count
$outinfo = $findResults | select DateTimeReceived,Sender,Subject,Size,foldername
$outinfotxt = $outinfo | fl | Out-String
$echocontent = @"
查询条件:
收件人:$upn
发件人:$Sender
主题:$subject
时间段:$starttime-$endtime
搜索结果数量:$num
具体信息:$outinfotxt
"@
Write-Host $echocontent -ForegroundColor gray
$result = $findResults
}else{
$userobject = New-Object psobject -Property @{
searchuser = $recsamid
DateTimeReceived = ""
Sender= $Sender
Subject= $subject
Size= ""
foldername= ""
action= ""
errorinfo= "搜索结果为0"
}
$result += $userobject
}
}else{
$userobject = New-Object psobject -Property @{
searchuser = $recsamid
DateTimeReceived = ""
Sender= $Sender
Subject= $subject
Size= ""
foldername= ""
action= ""
errorinfo= "Not Exsit Recipent"
}
$result += $userobject
}
}
return $result
}else{
Write-Host "请输入发件人完整地址" -ForegroundColor Red
}
}else{
Write-Host "请输入邮件主题关键词" -ForegroundColor Red
}
}else{
Write-Host "starttime应小于endtime" -ForegroundColor Red
}
}else{
Write-Host "请提供收件人信息" -ForegroundColor Red
}
}
}