Powershell应用于Outlook Com对象 - 多个过滤器

时间:2014-04-04 02:09:46

标签: powershell outlook automation

原始邮件:

目标:每天都会从来源向服务帐户发送电子邮件。 拿它给我的csv文件,把它放在DBA人的文件夹中。

如果没有进一步的说明,这是我目前的脚本:

#define variables
$datestamp = (get-date).AddDays(-1).ToString("MMddyyyy")
$datestamp = $datestamp.ToString()
$path = "C:\MyPath"
$dest = "C:\MyPath\Archive" 
$file = "MyFile.csv"

#create outlook session
$objOutlook   = New-Object -Com Outlook.Application
$inbox   = $objOutlook.Session.GetDefaultFolder(6)

$inbox.Items.Restrict("[UnRead] = True" -and "[SenderEmailAddress] = 'SomePlace@SomeDomain.net'") | select -Expand Attachments | % 
{
    for ($i = $_.Count; $i; $i--) 
    {
      $_.Item($i).SaveAsFile("C:\MyPath\$($_.Item($i).FileName)")
      $_.Parent.Unread = $false
    }
} 

if (Test-Path "C:\MyPath\*.csv")
{
    if(((Get-ChildItem C:\MyPath | Measure-Object ).Count) -gt '1' )
        {
            Send-MailMessage –SmtpServer "server.domain.com" –From "PoorITGuy@domain.com" -To "PoorITGuy@domain.com" -Subject " FAIL" -Body "FAILED. Too many valid items from mailbox.
                $objOutlook.quit()
            [System.Runtime.Interopservices.Marshal]::ReleaseComObject($objOutlook) 
                throw "Too many items to get."  
        }
    else
        {
         Get-ChildItem $path\*.csv | foreach {Copy-Item $_ "C:\MyPath\$"}
         Copy-Item C:\MyPath\*.csv  "$path\$file"
         Copy-Item C:\MyPath\*.csv "$dest\${datestamp}_$file"

            if(Test-Path "$dest\$file")
            {
                Send-MailMessage –SmtpServer "server.domain.com" –From "PoorITGuy@domain.com"   -To "PoorITGuy@domain.com" -Subject "some message”
                #cleanup - remove all files from base directory, clean mailbox, close out com object.
                Remove-Item "$path\*.csv"
                $inbox.Items | select | %
                {
                    for ($i = $_.Count; $i; $i--) 
                    {
                     $_.Item($i).Delete
                    }
                        }
                $objOutlook.quit()
                [System.Runtime.Interopservices.Marshal]::ReleaseComObject($objOutlook)
            }
            else
            {
                Send-MailMessage –SmtpServer "server.domain.com"  –From "PoorITGuy@domain.com" -To "PoorITGuy@domain.com" -Subject " failure" -Body "File manipulation failure."    
                $objOutlook.quit()
                [System.Runtime.Interopservices.Marshal]::ReleaseComObject($objOutlook)
                    throw "File manipulation failure."
            }

        }
}
else
{
        Send-MailMessage –SmtpServer "server.domain.com"  –From "PoorITGuy@domain.com" -To PoorITGuy@domain.com -Subject "FAIL" -Body "No item mailbox."
                $objOutlook.quit()
               [System.Runtime.Interopservices.Marshal]::ReleaseComObject($objOutlook)
                throw "No item to get in inbox."  
}

什么不起作用:

$inbox.Items.Restrict("[UnRead] = True" -and "[SenderEmailAddress] =  'SomePlace@SomeDomain.net'") | select -Expand Attachments | % 

您似乎无法使用多个过滤器限制comObject Outlook.Application。

我已经对此进行了大量的搜索,并且无法找到关于如何最好地执行此任务的答案来代替此。但我希望我的脚本能够防垃圾邮件,因此它需要知道它是从预期的发件人发送的,并且它只需要是未读的(请参阅下面的错误捕获)

此外,我不确定这是否有效:

$inbox.Items | select | %
                    {
                        for ($i = $_.Count; $i; $i--) 
                        {
                         $_.Item($i).Delete
                        }
                            }

也想在脚本本身输入。任何使其更有效的输入都将受到赞赏。

1 个答案:

答案 0 :(得分:0)

正确的代码(上面的大量语法错误阻止了它做我想做的事)

#define variables
$datestamp = (get-date).AddDays(-1).ToString("MMddyyyy")
$datestamp = $datestamp.ToString()

$path = "C:\MyPath"
$dest = "C:\MyPath\Archive" 
$importpath = "C:\MyPath\Import"
$file = "MyFile.csv"

$folderExclude = "C:\MyPath\Archive"

#create outlook session
$objOutlook   = New-Object -Com Outlook.Application
$inbox   = $objOutlook.Session.GetDefaultFolder(6)



$inbox.Items.Restrict("[Unread] = True AND [SenderEmailAddress] = 'SomePlace@SomeDomain.net'") | select -Expand Attachments | % {
    for ($i = $_.Count; $i; $i--) {
      $_.Item($i).SaveAsFile("\\server\MyPath\$($_.Item($i).FileName)")
      $_.Parent.Unread = $false
    }
} 

if (Test-Path "C:\MyPath\*.csv") {
    if(((Get-ChildItem C:\MyPath -Include "*.csv" | Measure-Object ).Count) -gt '1' ) {
            Send-MailMessage -SmtpServer smtpserver.mydomain.com -From Powershell@mydomain.com -To someguy@mydomain.com -Subject "FAIL" -Body "FAILED. Too many items from PSAutomationSrv mailbox."
                $objOutlook.quit()
            [System.Runtime.Interopservices.Marshal]::ReleaseComObject($objOutlook) 
                throw "Too many items to get."  
        }
    else {
         Copy-Item C:\MyPath\*.csv  "$importpath\$file"
         Copy-Item C:\MyPath\*.csv "$dest\${datestamp}_$file"

            if(Test-Path "$dest\${datestamp}_$file") {
                Send-MailMessage -SmtpServer smtpserver.mydomain.com -From Powershell@mydomain.com -To someguy@mydomain.com -Subject " successful" -Body "Date is: ${datestamp} File name is: ${dest}\${file}"
                #cleanup - remove all files from base directory, clean mailbox, close out com object.
                Remove-Item $path\*.csv
                $objOutlook.quit()
                [System.Runtime.Interopservices.Marshal]::ReleaseComObject($objOutlook)
            }
            else {
                Send-MailMessage -SmtpServer smtpserver.mydomain.com -From Powershell@mydomain.com -To someguy@mydomain.com -Subject " import - failure" -Body "File manipulation failure." 
                $objOutlook.quit()
                [System.Runtime.Interopservices.Marshal]::ReleaseComObject($objOutlook)
                    throw "File manipulation failure."
            }           
        }
}
else {
        Send-MailMessage -To -SmtpServer smtpserver.mydomain.com -From Powershell@mydomain.com -To someguy@mydomain.com -Subject "FAIL" -Body "FAILED. No item in mailbox."
                $objOutlook.quit()
            [System.Runtime.Interopservices.Marshal]::ReleaseComObject($objOutlook)
                throw "No item to get in inbox."  
}

备注 - 我有一些超出的代码。

Get-ChildItem $path\*.csv | foreach {Copy-Item $_ "C:\MyPath\$"}

是不正确的语法,并且不必要,因为脚本已经知道它只是操纵一个文件。

要删除收件箱,我需要使用Export-Mailbox,我不想这样做;因为执行此功能的服务帐户不是交换管理员,也不是我想要的。我只是定期手动删除收件箱,或让交换人员在他的最后完成。