我每周自动收到一封带有附件的电子邮件,并且带有 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 新手,刚刚学习自动化。 非常感谢:)
首先,我注意到以下代码:
#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
集合。
逻辑必须稍作改变。首先,电子邮件附件被视为一个项目,因此以下内容应与上述代码结合使用。
替换这条线 -
$emails[0].Attachments | Select-Object $_.saveasfile(($filePath))
具有以下内容-
$attachment = $emails.Attachments.Item(3)
$attachment.SaveAsFile($filePath + $attachment.FileName)
我注意到代码没有错误处理,所以我会插入一些检查,也许还会捕获一些异常,所以最好有 if-else 循环,因为有时收到的电子邮件可能不包含任何附件,所以检查总是非常重要的事情。