请求协助完善PowerShell脚本:按PR_INTERNET_MESSAGE_ID复制.msg文件
通过PowerShell按Internet Message ID定位Outlook邮件并导出为.msg文件
背景
Outlook(v2038)和Exchange(5.5)支持按主题、发件人等条件搜索邮件,但没有内置的按Internet Message ID搜索的功能。我们需要编写用户端PowerShell脚本,通过Message ID定位邮件并导出为.msg文件,同时降低对Exchange服务器的性能影响。脚本已在PSv7.4、PSv5.1及Outlook 2016(v2038)测试通过。
修改后的完整脚本
# 加载Outlook互操作程序集 $InteropPath = "C:\Program Files\Microsoft Office\root\Office16\ADDINS\Microsoft Power Query for Excel Integrated\bin\Microsoft.Office.Interop.Outlook.dll" Add-Type -Path $InteropPath -ErrorAction Stop | Out-Null # 初始化Outlook应用和MAPI命名空间 $Outlook = New-Object -ComObject Outlook.Application $MAPI = $Outlook.GetNamespace("MAPI") # 定义目标文件夹(示例:收件箱下的"Test Folder") $olDefaultFolderInbox = 6 $Inbox = $MAPI.GetDefaultFolder($olDefaultFolderInbox) $TargetFolderName = "Test Folder" $TargetFolder = $Inbox.Folders | Where-Object { $_.Name -eq $TargetFolderName } if (-not $TargetFolder) { Write-Error "目标文件夹 '$TargetFolderName' 不存在,请检查名称是否正确。" exit 1 } # 定义要搜索的目标Message ID列表(支持多ID批量处理) $TargetMessageIDs = @( "<YYYYMMDDHHmm.uniqueID1@subdomain.domain.tld>", "<YYYYMMDDHHmm.uniqueID2@subdomain.domain.tld>" ) # 定义.msg文件保存路径 $SavePath = "C:\ExportedEmails" if (-not (Test-Path $SavePath)) { New-Item -ItemType Directory -Path $SavePath | Out-Null } # 遍历目标文件夹中的邮件,匹配Message ID并导出 foreach ($email in $TargetFolder.Items) { try { $currentMsgID = $email.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x007D001E") if ($TargetMessageIDs -contains $currentMsgID) { # 生成唯一文件名(避免重名) $fileName = "$($currentMsgID.Trim('<','>'))_$(Get-Date -Format 'yyyyMMddHHmmss').msg" $fullSavePath = Join-Path -Path $SavePath -ChildPath $fileName # 导出为.msg文件(olMSG格式值为3) $email.SaveAs($fullSavePath, 3) Write-Host "已成功导出邮件:$fullSavePath" } } catch { Write-Warning "处理邮件时出错:$($_.Exception.Message)" continue } } # 清理COM对象 [System.Runtime.Interopservices.Marshal]::ReleaseComObject($Outlook) | Out-Null [System.GC]::Collect() [System.GC]::WaitForPendingFinalizers()
关键修改说明
- 保留邮件对象:原脚本仅提取了Message ID,修改后遍历过程中保留完整的邮件对象,以便后续调用
SaveAs方法导出。 - 批量支持:将目标Message ID改为列表形式,可一次性处理多封邮件。
- 路径处理:自动创建导出目录,避免因路径不存在导致失败;生成包含Message ID和时间戳的文件名,防止重名覆盖。
- 异常处理:添加try/catch块捕获处理邮件时的错误,避免脚本中断。
- COM对象清理:手动释放Outlook COM对象,防止进程残留。
注意事项
- 确保运行脚本的用户有权限访问目标Outlook文件夹。
- 若使用不同版本的Office,需调整
$InteropPath中的Office版本号(如Office15对应Office 2013)。 SaveAs方法的格式参数:3对应.msg格式,若需其他格式可参考Outlook枚举值(如olMSGUnicode=34)。
内容的提问来源于stack exchange,提问作者trblshootr
相关产品推荐
相关产品推荐

