如何使用 PowerShell 下载第一封电子邮件附件?

问题描述 投票:0回答:2

我每周自动收到一封带有附件的电子邮件,并且带有 Outlook 规则,它被保存在我收件箱的文件夹中。我的目标是创建一个 PowerShell 脚本,用于从具有最新“ReceivedTime”的电子邮件中下载附件。我已设法按“ReceivedTime”对文件夹中的对象进行排序,并获取列表中的最新电子邮件:“$emails[0]”,我可以看到附件的名称,但我似乎找不到如何下载该文件本身。 我得到的错误如下:“您无法在空值表达式上调用方法。”

我的代码如下所示:

$outlook = New-Object -ComObject outlook.application
$mapi = $outlook.GetNamespace("MAPI");

#Get Folder path
$filePath = "C:\Temp\test"
$inbox = $mapi.GetDefaultFolder(6) 
$inbox.Folders | Select-Object FolderPath
$olFolderPath = "\\[email protected]\Inbox\compliance"

#Get Emails Items from folder
$targetFolder = $inbox.Folders | Where-Object { $_.FolderPath -eq $olFolderPath } 


#Sort Emails in folder by date
$emails = $targetFolder.Items | Sort-Object ReceivedTime -Descending

#download attachements
$emails[0].Attachments | Select-Object $_.saveasfile(($filePath))

我正在使用本指南下载附件,但我的用例与文章中描述的有点不同:https://bronowski.it/blog/2020/09/ saving-outlook-attachments-with -powershell/

抱歉,如果这是一个非常简单的任务,我是 PowerShell 新手,刚刚学习自动化。 非常感谢:)

powershell email automation outlook
2个回答
1
投票

首先,我注意到以下代码:

#Sort Emails in folder by date
$emails = $targetFolder.Items | Sort-Object ReceivedTime -Descending

相反,您需要使用 Items 类的

Sort
方法,该方法按指定属性对项目集合进行排序。此方法完成后,集合的索引将重置为 1。因此,要获取第一项,请使用 1 索引而不是 0。

$emails[1].Attachments[1].SaveAsFile(($filePath))

请注意,Attachments 对象包含一组代表 Outlook 项目中附件的

Attachment
对象。使用
Attachments
属性返回任何 Outlook 项目(注释除外)的
Attachments
集合。


0
投票

逻辑必须稍作改变。首先,电子邮件附件被视为一个项目,因此以下内容应与上述代码结合使用。

替换这条线 -

$emails[0].Attachments | Select-Object $_.saveasfile(($filePath))

具有以下内容-

$attachment = $emails.Attachments.Item(3)
$attachment.SaveAsFile($filePath + $attachment.FileName)

我注意到代码没有错误处理,所以我会插入一些检查,也许还会捕获一些异常,所以最好有 if-else 循环,因为有时收到的电子邮件可能不包含任何附件,所以检查总是非常重要的事情。

© www.soinside.com 2019 - 2024. All rights reserved.