使用Ews API去删除邮件内容中包含特定关键字的邮件

之前分享过通过Ews去删除特定邮件主题的邮件方法,日常工作中会遇到只知道邮件内容中的部分关键字,需要去删除邮件。具体过程如下:
1 说明
通过EWS API去删除邮件中包含特定关键字方法,比传统的Search-Mailbox去删除特定邮件的方法更有效。EWS去查找邮箱项目一次可以返回1000个对象(可以通过策略解除限制),而Search-mailbox一次检索只能返回250个对象。并且Search-mailbox查询无法精确匹配,有时候会将筛选条件无关的内容查询出来。
EWS API可以在非Exchange上的任何服务器上执行,而Search-Mailbox命令只能在安装了Exchange Powershell工具的加域计算机上执行。如下测试为Exchange 2013环境,如果是Exchange 2016可以下载EWS manged ap1 2.2。
2 下载EWS manged API 2.0
首先通过如下地址下载Exchange EWS managed API。
下载并安装EWS Managed API:
https://www.microsoft.com/en-us/download/details.aspx?id=35371
3 安装EWS manged API
安装EWS managed API过程简单,在此不多说。



4 权限分配
直接Powershell脚本去调用EWS,需要执行脚本账号具备ApplicationImpersonation角色权限,所以首先需要为当前执行账号添加ApplicationImpersonation角色权限。
在Exchange服务器上使用Exchange Powershell执行如下命令创建角色组,并为用户分配权限。
New-RoleGroup -Name "ApplicationImpersonation" -Roles "ApplicationImpersonation" -Members Username

5 脚本文件内容
脚本分为两个部分,第一部分为主要执行删除邮件功能的脚本。脚本内容如下:
可以将如下内容另存为ews_body.ps1。
====================脚本开始===========================

param(
$Mailbox,
$userName=$cred.UserName,
$password=$cred.GetNetworkCredential().password,
[string]$body
)
# Remember to install the EWS managed API from here:
# http://www.microsoft.com/downloads/en/details.aspx?displaylang=en&FamilyID=c3342fb3-fbcc-4127-becf-872c746840e1
# https://www.microsoft.com/en-us/download/details.aspx?id=35371
# Then point the following command to the location of the DLL:
#设置Exchange服务器的EWs URL.
$uri=[system.URI] "https://mail.contoso.com/ews/exchange.asmx"
$dllpath = "C:\Program Files\Microsoft\Exchange\Web Services\2.0\Microsoft.Exchange.WebServices.dll"
Import-Module $dllpath

# Set Exchange Version and connect to Exchange Server
$exchService = new-object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2013_CU21)
$ExchangeVersion = [Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2013_CU21
$service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService($ExchangeVersion)
$service.Credentials = New-Object Microsoft.Exchange.WebServices.Data.WebCredentials -ArgumentList $userName,$password
$service.url = $uri
$service.ImpersonatedUserId = New-Object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId `
([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SMTPAddress,$Mailbox);

$folders = New-Object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::MsgFolderRoot, $Mailbox)
$MailboxRoot=[Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,$folders)
$FolderList = new-object Microsoft.Exchange.WebServices.Data.FolderView(100)
$FolderList.Traversal = [Microsoft.Exchange.WebServices.Data.FolderTraversal]::Deep
$findFolderResults = $MailboxRoot.FindFolders($FolderList)

foreach ($fdr in $findFolderResults.Folders)
{
$ItemView = New-Object Microsoft.Exchange.WebServices.Data.ItemView(10000)
$emailsInFolder = $null
do
{
$emailsInFolder = $fdr.FindItems($ItemView)
if ($emailsInFolder.Items.Count -gt 0)
{
$psPropset= new-object Microsoft.Exchange.WebServices.Data.PropertySet([Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties)
[Void]$service.LoadPropertiesForItems($emailsInFolder,$psPropset)
foreach ($individualEmail in $emailsInFolder.Items)
{

if ($individualEmail.body.text -match $body)
{
"$($individualEmail.From.Address),["+"$($individualEmail.ToRecipients.address)],["+"$($individualEmail.CcRecipients.address)],"+"$($individualEmail.subject)"+",$($individualEmail.DateTimeSent)"+",$($individualEmail.DateTimeReceived)"+",$($individualEmail.IsRead)" | Out-File $logfile -Append -Encoding utf8
echo "successfully found the email contains $body from $Mailbox"
$individualEmail.Delete([Microsoft.Exchange.WebServices.Data.DeleteMode]::HardDelete)
echo "successfully deleted the email contains $body from $Mailbox"
}
}
}
$ItemView.offset +=$emailsInFolder.Items.Count
}while($emailsInFolder.moreAvailable -eq $true)
}

========================脚本结束======================

第二部分脚本内容为调用第一部分脚本,然后将执行删除的邮件的必要信息记录在文件中,以便查询。
脚本内容如下:
============================脚本开始=========================

$mailboxlist=Import-Csv -Path .\allMailboxList.csv
$TIME=Get-Date -Format yyyy-MM-dd-hh-mm-ss
[string]$logfile=".\$($TIME)_delete_log.txt"
"sender,"+"Recipients,"+"CcRecipients,"+"Subject,"+"Email_DateTimeSent"+",DateTimeReceived"+",Email_IsRead" | Out-File $logfile -Append -Encoding utf8
foreach($mailboxs in $mailboxlist)
{
     $Bodylist=Import-Csv -Path .\BodyList.csv
     foreach($Body in $Bodylist)
     {
       write-host "Now finding body contain $($Body.body) from $($mailboxs.PrimarySmtpAddress)........."
       .\ews_body.ps1 -Mailbox $mailboxs.PrimarySmtpAddress -Body $Body.body -userName "[email protected]" -password "[email protected]"
     }

} 

=============================脚本结束========================

脚本中文件说明,如下两个文件需要放置脚本相同目录下。
allMailboxList.csv为邮箱列表,为需要操作的邮箱对象列表。

BodyList.csv 为需要匹配的邮件正文内容列表

6 测试内容准备
在测试账号邮箱中发送多封测试邮件。并且满足邮件内容包含特定内容。并且邮件中存在发件人、多个收件人和多个抄送对象。

7 脚本执行过程
直接执行脚本Action_ews_body.ps1

8 脚本执行结果
脚本执行完成后,会在脚本所在目录下生产一个log文件,该文件已当前时间为名称,记录删除邮件的情况。(发件人,收件人,抄送对象、邮件主题、邮件创建时间和邮件接收时间、以及邮件是否已读)

多个收件人和抄送对象,产生的日志文件。

9 脚本执行常见错误
在脚本执行过程中如果提示“该账号无权模拟所有请求的用户”,那么说明当前执行账号未在Exchange中分别ApplicationImpersonation角色权限。解决办法就是将当前账号添加到ApplicationImpersonation角色组中。

原文地址:http://blog.51cto.com/jialt/2312861

时间: 2024-10-09 15:04:25

使用Ews API去删除邮件内容中包含特定关键字的邮件的相关文章

shell判断变量内容里包含特定字符串

shell判断变量内容里包含特定字符串 shell [ "$str" =~ "IEEE80211" ] && echo "it contains IEEE80211" [email protected] 2017-5-11

给UIlabel的内容中的特定字符添加颜色,可以调整大小

摘要:实现对NSAttributedString的一个扩展,用法见.m的注释内容 #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @interface NSAttributedString (color) + (instancetype)getAtriWith:(NSString*)markup withDestStr:(NSArray*)deStrs andColor:(NSArray*)colors andFo

数据库中判断内容中是否包含中文

SQL Server 用patindex()函数判断,例如'patindex(%[吖-做]%',字段名)>0 Oracle 用lengthb()和length()函数求字段对应内容的的长度,长度不一样则说明内容中包含汉字 数据库中判断内容中是否包含中文,布布扣,bubuko.com

表单中输入内容,搜索时,下面table中该列中包含关键字的高亮显示

有时候为了在搜索时清楚直观,需要关键字的高亮显示, 效果如下: 思想:在下面table中,本来应该是直接渲染数据,此时,可以先写一个方法,里面包含两个参数,分别是该显示的内容以及进行搜索时输入的关键字,在该方法中,进行判断,若是该列内容中包含关键字,则将关键字颜色改变,然后替换掉:若是没有,则还是原样显示. 表单中: table表格中: 此时需要写关键字高亮显示的方法: 在该方法中,可以使用if判断来进行替换,也可以使用正则来写. 原文地址:https://www.cnblogs.com/520

(五)CodeMirror - 关于htmlmixed中包含script脚本

最近发现个问题,场景如下: 当创建的mode类型为htmlmixed,且内容中包含javascript脚本,且是闭包立即执行: 如果内容是使用JQuery函数.html()插入到DOM中后再创建codeMirror对象: 那么,这时,如果JS执行报错,那么随后创建codeMirror对象也中断了: 解决方法: 可以使用elem.text()方法插入内容,那么有错的JS也不会被执行到,可顺利进行后面的创建 1 var elem = $('#code'); 2 var str = ''<div cl

js自动过滤替换页面文本框和文本域内容中的特殊字符并进行提示

在开发java web页面时需要校验用户的输入内容是否合法,在进行校验时我们可以单独把校验特殊字符这块抽取出来,只需要在每个页面引用下该js即可实现校验不需要再页面设置其他东西,js会自动捕捉页面文本框和文本域,同时也方便了以后代码的复用. 代码如下: var tagname=''; var attrid=''; var tagvalue=''; document.oninput = function(e){ var o = e.srcElement || e.target; getValue(

EWS API 2.0读取日历信息-读取内容注意事项

[from] http://www.cnblogs.com/love007/archive/2013/06/26/3156852.html 采用模拟账号的方式读取日历信息,注意下日历的内容读取(Body)读取.代码如下:(采用 EWS API 2.0版本) 1.读取内容前必须设置如下属性:否则会提示:You must load or assign this property before you can read its value  Body 如下: //*******************

笔记01 登录、常用配置参数、Action访问Servlet API 和设置Action中对象的值、命名空间和乱码处理、Action中包含多个方法如何调用

Struts2登录 1. 需要注意:Struts2需要运行在JRE1.5及以上版本 2. 在web.xml配置文件中,配置StrutsPrepareAndExecuteFilter或FilterDispatcher 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <filter>     <filter-name>struts2</filter-name>     <filter-class>org.apache.struts2.di

制作由下向上的滚动字幕,字幕内容要求包含网站超级链接和图片超级链接, 使用鼠标移动事件控制字幕运动和停止。 2、在下拉列表框中设置五种以上颜色,选择颜色后, 滚动字幕背景色改变成相应颜色

<!DOCTYPE html><html>    <head>        <meta charset="UTF-8">        <title></title>    </head>    <!--        时间:2016-12-28        描述:1.制作由下向上的滚动字幕,字幕内容要求包含网站超级链接和图片超级链接,                   使用鼠标移动事件控制