Powershell 使用通配符从Outlook中读取来自特定发件人的附件

Powershell 使用通配符从Outlook中读取来自特定发件人的附件,powershell,outlook,Powershell,Outlook,我试图从Outlook中提取与senderemailaddress属性的通配符匹配的附件。从下面的代码中可以看出,我尝试使用两个过滤器,但没有效果 当我在代码中使用当前活动的未注释过滤器时,代码不会抛出任何错误,也不会下载与测试用例匹配的附件。但是,如果激活注释过滤器并运行它,则会出现以下错误 Exception calling "Restrict" with "1" argument(s): "Cannot parse condition. Error at "like"." At C:\Us

我试图从Outlook中提取与
senderemailaddress
属性的通配符匹配的附件。从下面的代码中可以看出,我尝试使用两个过滤器,但没有效果

当我在代码中使用当前活动的未注释过滤器时,代码不会抛出任何错误,也不会下载与测试用例匹配的附件。但是,如果激活注释过滤器并运行它,则会出现以下错误

Exception calling "Restrict" with "1" argument(s): "Cannot parse condition. Error at "like"." At C:\Users\acer\Desktop\outlook.ps1:42 char:2 + $filteredItems = $folder.items.Restrict($filter) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : ComMethodTargetInvocation 编辑1:谢谢大家的建议。 我可以通过使用unread=true进行过滤,并根据过滤邮件的属性匹配senderemailaddress

添加修改后的代码:

$filepath = "C:\folder\subfolder\subsubfolder\"
    function downloadFiles {
        $filter="[UnRead]=true"
    $emailfilter = "*@xyz.co.in"
    $subjectfilter = "test file*"

    Add-Type -Assembly "Microsoft.Office.Interop.Outlook" | Out-Null
        $olFolders = "Microsoft.Office.Interop.Outlook.olDefaultFolders" -as [type]

        $outlook = New-Object -ComObject Outlook.Application 
        $namespace = $outlook.GetNameSpace("MAPI")

        $folder = $namespace.GetDefaultFolder($olFolders::olFolderInBox)

        #$folder.Items | select SenderEmailAddress

        $filteredItems = $folder.Items.Restrict($filter)

        foreach ($objMessage in $filteredItems) {
            $subject = $objMessage.Subject
            $emailaddress = $objMessage.SenderEmailAddress

            if(($emailaddress -like $emailfilter) -and ($subject -like $subjectfilter)){
            $intCount = $objMessage.Attachments.Count

            if ($intCount -gt 0) {
                for ($i=1; $i -le $intCount; $i++) {
                    $objMessage.Attachments.Item($i).SaveAsFile($filepath+$objMessage.Attachments.Item($i).FileName)
                }
            }
            $objMessage.Unread = $false
          }

           else {continue}
       }
        $outlook.Close
    }

    downloadFiles

现在的问题是如何安排这个脚本?当我在命令提示符下使用powershell路径运行此脚本时,它工作正常。但当我安排同样的时间时,它并没有完成。我可以在TaskManager中看到由任务调度程序生成的outlook进程,必须手动终止该进程才能终止该进程。有什么想法吗?

提供商不允许在该方法的筛选器中使用
Like
。由此:

无法执行“包含”操作。比如你 无法使用“查找”或“限制”搜索具有特定 主题字段中的单词。相反,您可以使用AdvancedSearch 方法,或者您可以循环遍历文件夹中的所有项并使用 InStr函数用于在字段内执行搜索


提供程序不允许在此方法的筛选器中使用
Like
。由此:

无法执行“包含”操作。比如你 无法使用“查找”或“限制”搜索具有特定 主题字段中的单词。相反,您可以使用AdvancedSearch 方法,或者您可以循环遍历文件夹中的所有项并使用 InStr函数用于在字段内执行搜索

我会用它。省去了对Outlook进行编程访问的麻烦

最简单的方法是从nuget下载。您可以在PowerShell中首先下载nuget:

$sourceNugetExe = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe"
$targetNugetExe = "D:\Program Files\nuget\nuget.exe" # chaneg path to suit
Invoke-WebRequest $sourceNugetExe -OutFile $targetNugetExe
Set-Alias nuget $targetNugetExe -Scope Global -Verbose
然后下载EWS nuget软件包:

Set-Location D:\Temp # change to suit
nuget install 'Microsoft.Exchange.WebServices'
现在您可以开始使用:)

有关如何与EWS交互的更多信息,请参阅

另外,请参阅my other,它已过时,无法获取EWS程序集的来源,但确实有一些关于额外EWS方法/属性的有用信息。如果您没有使用自己的凭据(或者运行PowerShell的进程没有Exchange帐户),它还提供了有关如何使用备用凭据的详细信息。

我会使用。省去了对Outlook进行编程访问的麻烦

最简单的方法是从nuget下载。您可以在PowerShell中首先下载nuget:

$sourceNugetExe = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe"
$targetNugetExe = "D:\Program Files\nuget\nuget.exe" # chaneg path to suit
Invoke-WebRequest $sourceNugetExe -OutFile $targetNugetExe
Set-Alias nuget $targetNugetExe -Scope Global -Verbose
然后下载EWS nuget软件包:

Set-Location D:\Temp # change to suit
nuget install 'Microsoft.Exchange.WebServices'
现在您可以开始使用:)

有关如何与EWS交互的更多信息,请参阅


另外,请参阅my other,它已过时,无法获取EWS程序集的来源,但确实有一些关于额外EWS方法/属性的有用信息。如果您没有使用自己的凭据(或者运行PowerShell的进程没有Exchange帐户),它还提供了有关如何使用备用凭据的详细信息。

但是当字符串是数字时,我可以使用contains。示例:如果我的发件人地址是this/O=xxxxx/OU=EXCHANGE管理组(FYDIBOHF23SPDLT)/CN=RECIPIENTS/CN=02DE69998DE7457BBC1CAA86E82818DA lmnopqr,我可以使用过滤器-contains lmnopqr执行相同的操作,但当字符串是数字时,我可以使用contains。示例:如果我的sendermailaddress是/O=xxxxx/OU=EXCHANGE管理组(FYDIBOHF23SPDLT)/CN=RECIPIENTS/CN=02DE69998DE7457BBC1CAA86E82818DA lmnopqr,我可以使用筛选器-contains lmnopqr执行sameI无法访问脚本中的isread属性,即使它显示在对象属性列表中。Ant Suggestions
$items[0]有什么作用。IsRead
产生什么?
$items
没有属性IsRead。
不起作用。要访问某个项目,要进行测试,请尝试以下操作:
$item=$items |选择-First 1$item.IsRead
它就像一个符咒。非常感谢。使用这种方式访问邮箱的另一个好处是,它可以通过成功运行的任务调度器进行调度。一个问题是,这种方法是否需要在客户端计算机中安装outlook,以及如果我登录到该客户端,如何访问其他用户的邮箱。确切地将Outlook客户端从等式中去掉,由Microsoft开发(现在是开源的)。如果对您有帮助,请将我标记为答案,好吗?我无法访问脚本中的isread属性,即使它显示在对象属性列表中。Ant Suggestions
$items[0]有什么作用。IsRead
产生什么?
$items
没有属性IsRead。
不起作用。要访问某个项目,要进行测试,请尝试以下操作:
$item=$items |选择-First 1$item.IsRead
它就像一个符咒。非常感谢。使用这种方式访问邮箱的另一个好处是,它可以通过成功运行的任务调度器进行调度。一个问题是,这种方法是否需要在客户端计算机中安装outlook,以及如果我登录到该客户端,如何访问其他用户的邮箱。确切地将Outlook客户端从等式中去掉,由Microsoft开发(现在是开源的)。如果对你有帮助的话,你能帮我记下答案吗?