PowerShell无法获取Outlook邮件附件问题求助
PowerShell读取Outlook邮件无法获取附件问题
我用PowerShell读取Outlook收件箱,要获取带附件的指定邮件。目前能按日期筛选出目标邮件,但保存附件时始终拿不到附件——不管是随机邮件还是自己发的测试邮件(客户端确认有附件),都获取不到附件。
现有代码
$OutlookObj = New-Object -comObject outlook.application $OutlookNamespace = $OutlookObj.GetNamespace("MAPI") #$OutlookFolder = $OutlookNamespace.PickFolder() $olDefaultFolderInbox = 6 $OutlookFolder = $OutlookNamespace.GetDefaultFolder($olDefaultFolderInbox) $DownloadFilepath = "C:\Users\Me" $StringMatch = "Random" $StringMatch2 = "Random" # Dir to sav the attachements is made here $Downloaddir = Join-Path $DownloadFilepath "csv" New-Item -ItemType Directory -force -Path $Downloaddir $OutlookFolder.Items | ForEach-Object { $TodayDate = (Get-Date) $TodayDateStr = $TodayDate.ToString("yyyy/MM/dd") $TargetSubject = "Test mail - $StringMatch ($StringMatch2) for $TodayDateStr" if ((([DateTime]::Parse($_.ReceivedTime)).Date -eq $TodayDate.Date) -and ($_.Subject -eq $TargetSubject)) { $_.attachements } } $OutlookObj.Quit | Out-Null [GC]::Collect()
调试过程与结果
我用以下单行代码调试:
$OutlookFolder.Items | Select Subject, Attachements -Last 1 | Get-Member | Format-Table -Autosize
输出结果:
TypeName: Selected.System.__ComObject Name MemberType Definition ---- ---------- ---------- Equals Method bool Equals(System.Object obj) GetHashCode Method int GetHashCode() GetType Method type GetType() ToString Method string ToString() Attachements NoteProperty object Attachements=null Subject NoteProperty string Subject=
(注:已自行删除Subject内容)
我参考过几篇技术文章,但问题没解决。目前能读取邮件主题、正文并筛选,唯独拿不到附件。怀疑是账户安全策略限制,但不解为什么只有附件无法读取,求解决方案。
解决方案
修正拼写错误
代码里的attachements是拼写错误,Outlook COM对象的正确属性名是Attachments(双t)。这个错误是核心原因——PowerShell无法识别错误属性名,因此返回null。优化邮件筛选逻辑
直接遍历所有收件箱邮件效率低,建议用Items.Restrict()方法过滤日期和主题,提升性能:
$today = Get-Date $filter = "[ReceivedTime] >= '" + $today.Date.ToString("dd/MM/yyyy") + "' AND [ReceivedTime] < '" + $today.AddDays(1).Date.ToString("dd/MM/yyyy") + "' AND [Subject] = 'Test mail - $StringMatch ($StringMatch2) for $($today.ToString('yyyy/MM/dd'))'" $filteredItems = $OutlookFolder.Items.Restrict($filter)
- 正确获取并保存附件
修正拼写后,遍历邮件的Attachments集合并保存:
foreach ($item in $filteredItems) { if ($item.Attachments.Count -gt 0) { foreach ($att in $item.Attachments) { $savePath = Join-Path $Downloaddir $att.FileName $att.SaveAsFile($savePath) Write-Host "已保存附件:$savePath" } } }
- 权限与环境排查
- 确保PowerShell以管理员身份运行,避免文件保存路径权限不足
- 检查Outlook信任中心设置,确认没有阻止COM对象访问附件的策略
- 如果是Exchange账户,确认管理员未设置附件读取限制
完整修正代码
$OutlookObj = New-Object -comObject outlook.application $OutlookNamespace = $OutlookObj.GetNamespace("MAPI") $olDefaultFolderInbox = 6 $OutlookFolder = $OutlookNamespace.GetDefaultFolder($olDefaultFolderInbox) $DownloadFilepath = "C:\Users\Me" $StringMatch = "Random" $StringMatch2 = "Random" $Downloaddir = Join-Path $DownloadFilepath "csv" New-Item -ItemType Directory -force -Path $Downloaddir | Out-Null $today = Get-Date $targetSubject = "Test mail - $StringMatch ($StringMatch2) for $($today.ToString('yyyy/MM/dd'))" # 构建筛选条件,注意Outlook的日期格式要求为dd/MM/yyyy $filter = "[ReceivedTime] >= '" + $today.Date.ToString("dd/MM/yyyy") + "' AND [ReceivedTime] < '" + $today.AddDays(1).Date.ToString("dd/MM/yyyy") + "' AND [Subject] = '$targetSubject'" $filteredItems = $OutlookFolder.Items.Restrict($filter) foreach ($item in $filteredItems) { if ($item.Attachments.Count -gt 0) { foreach ($att in $item.Attachments) { $savePath = Join-Path $Downloaddir $att.FileName try { $att.SaveAsFile($savePath) Write-Host "附件保存成功:$savePath" } catch { Write-Host "保存附件失败:$($_.Exception.Message)" } } } else { Write-Host "该邮件无附件" } } $OutlookObj.Quit() | Out-Null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($OutlookObj) | Out-Null [GC]::Collect() [GC]::WaitForPendingFinalizers()
内容的提问来源于stack exchange,提问作者user22056736
相关产品推荐
相关产品推荐

