如何在PowerShell脚本中获取Outlook邮件的附件状态
用PowerShell判断Outlook邮件是否包含附件
问题背景
现有PowerShell脚本可获取邮箱内邮件列表及相关元数据,但无法判断邮件是否带有附件:
- 直接添加
HasAttachment属性,返回值全为空; - 使用
Attachments属性,返回System.__ComObject,无法直接读取附件信息; - 尝试
Attachments.DisplayName、Attachments[1].DisplayName、Attachments[1].FileName等写法,均无法成功获取附件相关内容。
曾通过$items += $item | Select-Object -Property "*", @{Label="Folder";Expression={$_.Parent.Name}}获取邮件所有可用属性,发现仅Attachments与附件相关,但该COM对象无法直接解析使用。
解决方案:读取MAPI属性PR_HASATTACH
通过Outlook对象的PropertyAccessor.GetProperty方法读取MAPI原生属性PR_HASATTACH(标识符为http://schemas.microsoft.com/mapi/proptag/0x0E1B000B),可准确判断邮件是否带有附件。同时完善脚本的参数传递和子文件夹递归逻辑,完整脚本如下:
function Get-MailFromOutlookFolder { param( [Parameter(Mandatory=$true)] $ParentFolder ) # 存储结果的数组 $items = @() # 处理当前文件夹的邮件 foreach ($item in $ParentFolder.Items) { if ($item.Class -eq 43) { # Class=43表示邮件项 # 获取PR_HASATTACH属性,判断是否有附件 $hasAttach = $item.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x0E1B000B") # 收集邮件元数据 $items += $item | Select-Object -Property ` ConversationTopic, ReceivedTime, Body, SenderName, SenderEmailAddress, @{Label="Folder"; Expression={$_.Parent.Name}}, @{Label="HasAttachment"; Expression={$hasAttach}} } } # 递归处理子文件夹 foreach ($subFolder in $ParentFolder.Folders) { $items += Get-MailFromOutlookFolder -ParentFolder $subFolder } return $items } # 初始化Outlook对象 $outlook = New-Object -Com "Outlook.Application" $mapi = $outlook.GetNamespace("MAPI") # 获取邮箱根目录(包含收件箱、发件箱等所有文件夹) $mailboxRoot = $mapi.GetDefaultFolder([Microsoft.Office.Interop.Outlook.OlDefaultFolders]::olFolderInbox).Parent # 执行获取邮件操作 $results = Get-MailFromOutlookFolder -ParentFolder $mailboxRoot # 导出为CSV文件(避免中文乱码和多余类型信息) $results | Export-Csv -Path "C:\Bleh\email.csv" -Encoding UTF8 -NoTypeInformation
关键说明
PR_HASATTACH是MAPI原生属性,返回布尔值$true或$false,直接对应邮件是否带有附件;- 脚本添加了子文件夹递归处理逻辑,可捕获邮箱根目录下所有层级子文件夹的邮件;
- 导出CSV时增加
-Encoding UTF8 -NoTypeInformation参数,解决中文乱码和文件头部冗余类型信息问题。
内容的提问来源于stack exchange,提问作者oymonk
相关产品推荐
相关产品推荐

