Powershell 从Exchange下载包含多个主题的附件

Powershell 从Exchange下载包含多个主题的附件,powershell,exchangewebservices,Powershell,Exchangewebservices,我试图从收件箱中带有特定主题行的电子邮件中下载附件,然后删除该电子邮件。 总共有十几个不同的主题行。 我希望将此进程安排为每10分钟左右运行一次,因此我希望将任何处理开销保持在最低限度 当前的脚本在PowerShell中(基于),但我不确定如何使它在一系列不同的主题中循环。我可以为每个主题重复整个脚本,但这样做效率很低。。 我也对非PowerShell的替代方案持开放态度 $MailboxName = "mailbox@address.com" $Subject = @("Subject1")

我试图从收件箱中带有特定主题行的电子邮件中下载附件,然后删除该电子邮件。 总共有十几个不同的主题行。 我希望将此进程安排为每10分钟左右运行一次,因此我希望将任何处理开销保持在最低限度

当前的脚本在PowerShell中(基于),但我不确定如何使它在一系列不同的主题中循环。我可以为每个主题重复整个脚本,但这样做效率很低。。 我也对非PowerShell的替代方案持开放态度

$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)
           }
         }