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

请求协助完善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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 18:25:22