You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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内容)

我参考过几篇技术文章,但问题没解决。目前能读取邮件主题、正文并筛选,唯独拿不到附件。怀疑是账户安全策略限制,但不解为什么只有附件无法读取,求解决方案。


解决方案

  1. 修正拼写错误
    代码里的attachements是拼写错误,Outlook COM对象的正确属性名是Attachments(双t)。这个错误是核心原因——PowerShell无法识别错误属性名,因此返回null。

  2. 优化邮件筛选逻辑
    直接遍历所有收件箱邮件效率低,建议用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)
  1. 正确获取并保存附件
    修正拼写后,遍历邮件的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"
        }
    }
}
  1. 权限与环境排查
  • 确保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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 10:45:12