Powershell 从Exchange下载包含多个主题的附件
我试图从收件箱中带有特定主题行的电子邮件中下载附件,然后删除该电子邮件。 总共有十几个不同的主题行。 我希望将此进程安排为每10分钟左右运行一次,因此我希望将任何处理开销保持在最低限度 当前的脚本在PowerShell中(基于),但我不确定如何使它在一系列不同的主题中循环。我可以为每个主题重复整个脚本,但这样做效率很低。。 我也对非PowerShell的替代方案持开放态度Powershell 从Exchange下载包含多个主题的附件,powershell,exchangewebservices,Powershell,Exchangewebservices,我试图从收件箱中带有特定主题行的电子邮件中下载附件,然后删除该电子邮件。 总共有十几个不同的主题行。 我希望将此进程安排为每10分钟左右运行一次,因此我希望将任何处理开销保持在最低限度 当前的脚本在PowerShell中(基于),但我不确定如何使它在一系列不同的主题中循环。我可以为每个主题重复整个脚本,但这样做效率很低。。 我也对非PowerShell的替代方案持开放态度 $MailboxName = "mailbox@address.com" $Subject = @("Subject1")
$MailboxName = "mailbox@address.com"
$Subject = @("Subject1")
$downloadDirectory = "c:\temp"
Function FindTargetFolder($FolderPath){
$tfTargetidRoot = new-object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::MsgFolderRoot,$MailboxName)
$tfTargetFolder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,$tfTargetidRoot)
for ($lint = 1; $lint -lt $pfArray.Length; $lint++) {
$pfArray[$lint]
$fvFolderView = new-object Microsoft.Exchange.WebServices.Data.FolderView(1)
$SfSearchFilter = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+isEqualTo([Microsoft.Exchange.WebServices.Data.FolderSchema]::DisplayName,$pfArray[$lint])
$findFolderResults = $service.FindFolders($tfTargetFolder.Id,$SfSearchFilter,$fvFolderView)
if ($findFolderResults.TotalCount -gt 0){
foreach($folder in $findFolderResults.Folders){
$tfTargetFolder = $folder
}
}
else{
"Error Folder Not Found"
$tfTargetFolder = $null
break
}
}
$Global:findFolder = $tfTargetFolder
}
$dllpath = "C:\Program Files\Microsoft\Exchange\Web Services\1.2\Microsoft.Exchange.WebServices.dll"
$service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2007_SP1)
$windowsIdentity = [System.Security.Principal.WindowsIdentity]::GetCurrent()
$sidbind = "LDAP://<SID=" + $windowsIdentity.user.Value.ToString() + ">"
$aceuser = [ADSI]$sidbind
$uri=[system.URI] "https://webmail.company.com.au/EWS/Exchange.asmx"
$service.Url = $uri
FindTargetFolder($ProcessedFolderPath)
$folderid = new-object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox,$MailboxName)
$InboxFolder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,$folderid)
$Sfsub = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo([Microsoft.Exchange.WebServices.Data.ItemSchema]::Subject, $Subject[0])
$Sfha = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo([Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::HasAttachments, $true)
$sfCollection = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+SearchFilterCollection([Microsoft.Exchange.WebServices.Data.LogicalOperator]::And);
$sfCollection.add($Sfsub)
$sfCollection.add($Sfha)
$view = new-object Microsoft.Exchange.WebServices.Data.ItemView(2000)
$frFolderResult = $InboxFolder.FindItems($sfCollection,$view)
foreach ($miMailItems in $frFolderResult.Items){
$miMailItems.Subject
$miMailItems.Load()
foreach($attach in $miMailItems.Attachments){
$attach.Load()
$fiFile = new-object System.IO.FileStream(($downloadDirectory + “\” + (Get-Date -Format "yyMMdd") + "_" + $attach.Name.ToString()), [System.IO.FileMode]::Create)
$fiFile.Write($attach.Content, 0, $attach.Content.Length)
$fiFile.Close()
write-host "Downloaded Attachment : " + (($downloadDirectory + “\” + (Get-Date -Format "yyMMdd") + "_" + $attach.Name.ToString()))
}
$miMailItems.isread = $true
$miMailItems.Update([Microsoft.Exchange.WebServices.Data.ConflictResolutionMode]::AlwaysOverwrite)
$miMailItems.delete([Microsoft.Exchange.WebServices.Data.DeleteMode]::MoveToDeletedItems)
}
$MailboxName=”mailbox@address.com"
$Subject=@(“Subject1”)
$downloadDirectory=“c:\temp”
函数FindTargetFolder($FolderPath){
$TFTargetRoot=新对象Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::MsgFolderRoot,$MailboxName)
$tfTargetFolder=[Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,$TFTargetRoot)
对于($lint=1;$lint-lt$pfArray.Length;$lint++){
$pfArray[$lint]
$fvFolderView=新对象Microsoft.Exchange.WebServices.Data.FolderView(1)
$SfSearchFilter=新对象Microsoft.Exchange.WebServices.Data.SearchFilter+isEqualTo([Microsoft.Exchange.WebServices.Data.FolderSchema]::DisplayName,$pfArray[$lint])
$findFolderResults=$service.FindFolders($tfargetFolder.Id、$SfSearchFilter、$fvFolderView)
如果($findFolderResults.TotalCount-gt 0){
foreach($findFolderResults.Folders中的文件夹){
$tfTargetFolder=$folder
}
}
否则{
“找不到错误文件夹”
$TFargetFolder=$null
打破
}
}
$Global:findFolder=$tfargetfolder
}
$dllpath=“C:\Program Files\Microsoft\Exchange\Web Services\1.2\Microsoft.Exchange.WebServices.dll”
$service=新对象Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2007_SP1)
$windowsIdentity=[System.Security.Principal.windowsIdentity]::GetCurrent()
$sidbind=“LDAP://”
$aceuser=[ADSI]$sidbind
$uri=[system.uri]“https://webmail.company.com.au/EWS/Exchange.asmx"
$service.Url=$uri
FindTargetFolder($ProcessedFolderPath)
$folderid=新对象Microsoft.Exchange.WebServices.Data.folderid([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::收件箱,$MailboxName)
$InboxFolder=[Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,$folderid)
$Sfsub=新对象Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo([Microsoft.Exchange.WebServices.Data.ItemSchema]::主题,$Subject[0])
$Sfha=新对象Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo([Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::HasAttachments,$true)
$sfCollection=新对象Microsoft.Exchange.WebServices.Data.SearchFilter+SearchFilterCollection([Microsoft.Exchange.WebServices.Data.LogicalOperator]::和);
$sfCollection.add($Sfsub)
$sfCollection.add($Sfha)
$view=新对象Microsoft.Exchange.WebServices.Data.ItemView(2000)
$frFolderResult=$InboxFolder.FindItems($sfCollection,$view)
foreach($frFolderResult.Items中的miMailItems){
$miMailItems.Subject
$miMailItems.Load()
foreach($miMailItems.Attachments中的附件){
$attach.Load()
$fiFile=new object System.IO.FileStream(($downloadDirectory+“\”+(获取日期-格式“yyMMdd”)+“\”+$attach.Name.ToString()),[System.IO.FileMode]::Create)
$fiFile.Write($attach.Content,0,$attach.Content.Length)
$fiFile.Close()
写入主机“下载的附件:”+($downloadDirectory+“\”+(获取日期-格式为“yyMMdd”)+“\+$attach.Name.ToString()))
}
$miMailItems.isread=$true
$miMailItems.Update([Microsoft.Exchange.WebServices.Data.ConflictResolutionMode]::AlwaysOverwrite)
$miMailItems.delete([Microsoft.Exchange.WebServices.Data.DeleteMode]::MoveToDeletedItems)
}
好的,下面是我得到的:
$Subjects = @(
'newIM_IPSC',
'newCM_IPSC',
'CNSDI',
'SMEC_Incident_SLM',
'Incident_SLM',
'MEC_Incident_WorkInfo',
'SMEC_Incident_Header',
'SMEC_SR_Header'
)
[regex]$SubjectRegex = ‘^(?i)(‘ + (($Subjects |foreach {[regex]::escape($_)}) –join “|”) + ‘)$’
然后:
根据需要从$Subjects数组中添加或删除主题行
有关构建正则表达式的位的说明,请参见:
如果你能发布主题行,我想我可以向你展示如何构建一个正则表达式,在一个过程中匹配所有主题行。目前的欢呼声@mjolinor列表是:newIM_IPSC,newCM_IPSC,CNSDI,SMEC_Incident_SLM,Incident_SLM,SMEC_Incident_WorkInfo,SMEC_Incident_Header,SMEC_SR_Header。谢谢。我会删除第65行到第67行,并用您提供的第二位替换第64行吗?我继续用脚本的其余部分更新示例,而不是依赖行号。太棒了。它起作用了:-)谢谢你的帮助。。不过我还有一个小问题。。可以让它搜索“subject contains X”而不是subject verbatim吗?[regex]$SubjectRegex='(?i)('+(($Subjects | foreach{[regex]::escape($)})–join“|”)+')注意在regex的开头删除了^。这将导致它匹配主题行中任何位置的字符串,而不仅仅是完整的行。
foreach($attach in $miMailItems.Attachments){
foreach ($miMailItems in $frFolderResult.Items){
if ($miMailItems.Subject -match $SubjectRegex)
{
$miMailItems.Load()
foreach($attach in $miMailItems.Attachments){
$attach.Load()
$fiFile = new-object System.IO.FileStream(($downloadDirectory + “\” + (Get-Date -Format "yyMMdd") + "_" + $attach.Name.ToString()), [System.IO.FileMode]::Create)
$fiFile.Write($attach.Content, 0, $attach.Content.Length)
$fiFile.Close()
write-host "Downloaded Attachment : " + (($downloadDirectory + “\” + (Get-Date -Format "yyMMdd") + "_" + $attach.Name.ToString()))
}
$miMailItems.isread = $true
$miMailItems.Update([Microsoft.Exchange.WebServices.Data.ConflictResolutionMode]::AlwaysOverwrite)
$miMailItems.delete([Microsoft.Exchange.WebServices.Data.DeleteMode]::MoveToDeletedItems)
}
}