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

Powershell - How to filter an attachment before download

我正在使用 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"}

请帮我更正这个说法

首先,您的代码将导致您的脚本下载和处理所有收件箱邮件。这就像 SQL 中没有 WHERE 子句的 SELECT 语句——尽管它在性能方面很糟糕。

使用 Items.Find/FindNextItems.Restrict(参见 https://docs.microsoft.com/en-us/office/vba/api/outlook.items.find)- 让 server/message 商店完成工作。对于您的第一个查询,请使用

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

对于第二个查询,OOM 不会让您搜索附件名称,即使扩展 MAPI(仅限 C++ 或 Delphi)公开了该功能(在 [=15= 上创建 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