Powershell -如何在下载前过滤附件



我正在使用PowerShell脚本从一封有多个附件的电子邮件中下载附件。

如果我使用下面的语句,它将下载所有附件。

# Find Unread mail messages
$UnreadMessages = $Inbox.Items | where-object {$_.Unread -and $_.SenderEmailAddress -imatch "usa"}

我想使用下面的语句下载一个特定的附件,但它没有给出任何东西。

# Find Unread mail messages
$UnreadMessages = $Inbox.Items | where-object {$_.Unread -and $_.SenderEmailAddress -imatch "usa" -and $_.Attachments -imatch "Backlog"}

请帮我更正这个声明

首先,您的代码将导致下载所有Inbox消息并由脚本处理。这就像SQL中没有WHERE子句的SELECT语句——在性能方面和它一样糟糕。

使用Items.Find/FindNextItems.Restrict(参见https://learn.microsoft.com/en-us/office/vba/api/outlook.items.find)—让服务器/消息存储完成工作。对于第一个查询,使用

@SQL=("urn:schemas:httpmail:read" = 0) AND ("http://schemas.microsoft.com/mapi/proptag/0x0065001F" like '%usa%')

对于第二个查询,OOM不允许您搜索附件名称,即使Extended MAPI(仅限c++或Delphi)公开了该功能(在PR_MESSAGE_ATTACHMENTS上创建RES_SUBRESTRICTION并指定PR_ATTACH_LONG_FILENAME作为搜索属性)。当然,您可以只使用第一个查询并遍历查询匹配,对于每个条目,循环遍历MailItem.Attachments集合中的每个Attachment对象——这远非理想状态,但仍比完全没有限制要好。
如果使用Redemption(我是它的作者——它是一个扩展的MAPI包装器,可以从任何语言中使用)是一个选项,它允许在查询中使用Attachments。类似于下面的内容(在我的脑海中,VBA):

set Session = CreateObject("Redemption.RDOSession")
Session.MAPIOBJECT = Application.Session.MAPIOBJECT
set Folder = Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox)
set restrItems = Folder.Items.Restrict(" (UnRead = 'true') AND (""http://schemas.microsoft.com/mapi/proptag/0x0065001F"" like '%usa%') AND (Attachments LIKE '%Backlog%')")
for each item in restrItems
Debug.Print item.Subject
next

最新更新