Powershell 使用通配符从Outlook中读取来自特定发件人的附件
我试图从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
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开发(现在是开源的)。如果对你有帮助的话,你能帮我记下答案吗?