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

PowerShell EWS API:如何下载邮件附件?

问题分析与修复方案

核心问题点

  • 未加载邮件附件属性:EWS的FindItems方法默认仅返回邮件基础元数据(如主题),不会自动加载附件集合。直接遍历$Item.Attachments会得到空集合,自然无法获取附件名称或内容。
  • 循环逻辑错误:foreach ($Item in $fiItems.Items[0])中fiItems.Items[0]是单个邮件对象,foreach循环单个元素无意义,会导致代码逻辑异常。
  • 文件路径错误:创建FileStream时使用"C:\"是目录路径而非具体文件路径,会触发IO异常,无法写入文件。
  • 权限风险:直接写入C盘根目录需要管理员权限,普通权限下会执行失败。

修正后的代码

Import-Module "C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll"

# 确保service对象已完成初始化(示例:需替换为实际账号信息)
# $service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2013)
# $service.Credentials = New-Object Microsoft.Exchange.WebServices.Data.WebCredentials("你的账号", "你的密码")
# $service.Url = New-Object Uri("https://outlook.office365.com/EWS/Exchange.asmx")

$folderid = New-Object Microsoft.Exchange.WebServices.Data.FolderId($v_FolderID)
$iv = New-Object Microsoft.Exchange.WebServices.Data.ItemView(1000)
$fiItems = $service.FindItems($folderid, $args[1], $iv)

# 加载所有邮件的完整属性(包含附件信息)
$propertySet = New-Object Microsoft.Exchange.WebServices.Data.PropertySet([Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties)
$service.LoadPropertiesForItems($fiItems.Items, $propertySet)

# 处理目标邮件(此处仅处理第一个邮件)
$Item = $fiItems.Items[0]
$v_Subject = $Item.Subject

# 创建专属附件保存目录,规避权限问题
$saveDir = "C:\EWS_Attachments\"
if (-not (Test-Path $saveDir)) {
    New-Item -ItemType Directory -Path $saveDir | Out-Null
}

foreach($attachment in $Item.Attachments) {
    # 仅处理独立文件附件(排除内嵌图片等类型)
    if ($attachment -is [Microsoft.Exchange.WebServices.Data.FileAttachment]) {
        $attachment.Load()
        $attachmentName = $attachment.Name
        Write-Host "检测到附件:$attachmentName"
        
        # 拼接完整保存路径
        $fullPath = Join-Path -Path $saveDir -ChildPath $attachmentName
        $fileStream = New-Object System.IO.FileStream($fullPath, [System.IO.FileMode]::Create)
        $fileStream.Write($attachment.Content, 0, $attachment.Content.Length)
        $fileStream.Close()
        Write-Host "附件已保存至:$fullPath"
    }
}

Out-File -FilePath "C:\EWSSubject.txt" -InputObject $v_Subject

关键修复说明

  1. 加载附件属性:通过LoadPropertiesForItems加载邮件完整属性集,确保Attachments集合被正确填充。
  2. 修正循环逻辑:直接获取目标邮件对象,避免无意义的foreach循环。
  3. 规范文件路径:创建独立的附件保存目录,用Join-Path拼接合法文件路径,解决权限与路径错误问题。
  4. 过滤附件类型:判断附件是否为FileAttachment类型,避免处理内嵌非独立附件。

内容的提问来源于stack exchange,提问作者ParshvaShah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 16:50:25