从Exchange下载具有多个主题的附件 [英] Download attachments with multiple subjects from Exchange

查看:84
本文介绍了从Exchange下载具有多个主题的附件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试从收件箱中具有某些主题行的电子邮件中下载附件,然后删除该电子邮件. 总共大约有十二个不同的主题行. 我希望将此过程安排为每10分钟左右运行一次,所以我希望将所有处理开销保持在最低水平.

I am attempting to download attachments from emails with certain subject lines in an inbox, then delete the email. There are about a dozen different subject lines in total. I want to schedule this process to run every 10 minutes or so, so I'd like to keep any processing overheads to a minimum..

当前脚本位于PowerShell中(基于

Current script is in PowerShell (based on this), but I'm unsure how I could make it loop through a bunch of different subjects. I could just repeat the whole script for each subject, but it's quite inefficient this way.. I'm open to non-PowerShell alternatives too..

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

推荐答案

好的,这就是我得到的:

Okay, here's what I've got:

$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 "|") + ‘)$’

然后:

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

根据需要在$ Subjects数组中添加或删除主题行.

Add or remove subject lines from the $Subjects array as needed.

有关构建正则表达式的位的说明可以在这里找到: http://blogs.technet.com/b/heyscriptingguy/archive/2011/02/18/speed-up-array-comparisons-in-powershell-with-a-runtime-regex.aspx

An explanation of the bits that are building the regex can be found here: http://blogs.technet.com/b/heyscriptingguy/archive/2011/02/18/speed-up-array-comparisons-in-powershell-with-a-runtime-regex.aspx

这篇关于从Exchange下载具有多个主题的附件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆