如何用PowerShell从Outlook第二个邮箱账户的收件箱保存附件
解决非默认Outlook邮箱的附件保存问题
修改后的PowerShell脚本
$td = Get-Date -Format "yyyy-MM-dd" $targetEmailAddress = "jdoe@company2.com" $AttachFile = "File Name.xlsx" $FileSavePath = "C:\Temp\Attached_File_$td.xlsx" $outlook = New-Object -ComObject Outlook.Application $mapi = $outlook.GetNamespace("MAPI") # 定位目标邮箱账户(通过SMTP地址匹配,避免显示名称重复问题) $targetMailbox = $mapi.Folders | Where-Object { $_.Store.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x39FE001F") -eq $targetEmailAddress } if (-not $targetMailbox) { Write-Error "未找到指定邮箱账户: $targetEmailAddress" exit 1 } # 获取目标邮箱的收件箱(6代表Outlook的收件箱常量olFolderInbox) $inbox = $targetMailbox.GetDefaultFolder(6) $emails = $inbox.Items # 筛选今日邮件并保存指定附件 foreach ($email in $emails) { # 直接比较日期部分,避免字符串转换的潜在误差 if ($email.ReceivedTime.Date.ToString("yyyy-MM-dd") -eq $td) { $email.Attachments | Where-Object { $_.FileName -eq $AttachFile } | ForEach-Object { $_.SaveAsFile($FileSavePath) Write-Host "已成功保存附件至: $FileSavePath" } } } # 释放COM对象,避免Outlook后台进程残留 [System.Runtime.Interopservices.Marshal]::ReleaseComObject($outlook) | Out-Null [System.GC]::Collect() [System.GC]::WaitForPendingFinalizers()
关键修改说明
定位目标邮箱
原脚本使用$mapi.GetDefaultFolder(6)只能获取默认账户的收件箱,现在通过遍历$mapi.Folders,利用MAPI属性标签0x39FE001F获取邮箱的SMTP地址,精准匹配目标账户。获取目标邮箱的收件箱
找到目标邮箱对象后,调用该对象的GetDefaultFolder(6)方法,即可获取对应邮箱的收件箱,而非默认账户的。优化细节
- 添加了邮箱不存在的错误判断,避免脚本无提示崩溃
- 优化日期比较逻辑,直接取邮件接收时间的日期部分进行匹配
- 添加COM对象释放代码,防止Outlook进程在后台残留
注意事项
- 确保Outlook已成功配置目标邮箱,且能正常访问
- 运行脚本时PowerShell需具备访问Outlook对象模型的权限
- 如果同一天可能收到多个同名附件,可修改
$FileSavePath添加时间戳(如C:\Temp\Attached_File_$($email.ReceivedTime.ToString('yyyy-MM-dd-HHmmss'))_$($_.FileName))避免覆盖
内容的提问来源于stack exchange,提问作者Mr. Majestyk
相关产品推荐
相关产品推荐

