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
关键修复说明
- 加载附件属性:通过
LoadPropertiesForItems加载邮件完整属性集,确保Attachments集合被正确填充。 - 修正循环逻辑:直接获取目标邮件对象,避免无意义的foreach循环。
- 规范文件路径:创建独立的附件保存目录,用
Join-Path拼接合法文件路径,解决权限与路径错误问题。 - 过滤附件类型:判断附件是否为
FileAttachment类型,避免处理内嵌非独立附件。
内容的提问来源于stack exchange,提问作者ParshvaShah
相关产品推荐
相关产品推荐

