PowerShell调用Outlook ReplyAll回复邮件不显示原邮件内容问题
问题根因
调用MailItem.ReplyAll()方法时,Outlook会自动生成携带原始邮件引用内容的默认回复正文。你的代码直接对$reply.Body执行全量赋值,会把自动生成的包含原始邮件的默认内容完全覆盖,最终仅保留你写入的"TEST BODY"文本,原始邮件内容不会保留。
修复方法
不要直接覆盖Body属性,将你需要新增的回复内容拼接在原有默认正文的开头即可。如果需要保留原始邮件的格式、图片、排版,建议操作HTMLBody属性而非纯文本Body属性,避免格式错乱。
核心修改点
把原来的全量赋值行:
$reply.body = "TEST BODY"
替换为内容拼接逻辑:
- 纯文本场景适配:
# 新内容在前,原有带原始邮件的默认内容在后 $reply.Body = "TEST BODY`r`n`r`n" + $reply.Body
- HTML格式邮件适配(保留原邮件排版):
# 在HTML正文的开头标签后插入自定义回复内容,不破坏原有结构 $reply.HTMLBody = $reply.HTMLBody.Replace("<body", "<body>TEST BODY<br><br>")
修改后完整可运行代码
Add-Type -assembly "Microsoft.Office.Interop.Outlook" Add-type -assembly "System.Runtime.Interopservices" try { $outlook = [Runtime.Interopservices.Marshal]::GetActiveObject('Outlook.Application') $outlookWasAlreadyRunning = $true } catch { try { $Outlook = New-Object -comobject Outlook.Application $outlookWasAlreadyRunning = $false } catch { write-host "You must exit Outlook first." exit } } $namespace = $Outlook.GetNameSpace("MAPI") $inbox = $namespace.GetDefaultFolder([Microsoft.Office.Interop.Outlook.OlDefaultFolders]::olFolderInbox) $Folder = $inbox.Folders | where-object { $_.name -eq "Folder name" } $mails = $Folder.Items | Where-Object {$_.Subject -like "This is the subject"} foreach($mail in $mails) { $reply = $mail.ReplyAll() # 替换原有的直接赋值逻辑,改为拼接内容,保留原始邮件引用 $reply.Body = "TEST BODY`r`n`r`n" + $reply.Body # 如果需要保留HTML格式请注释上面一行,启用下面一行 # $reply.HTMLBody = $reply.HTMLBody.Replace("<body", "<body>TEST BODY<br><br>") $reply.save() $inspector = $reply.GetInspector $inspector.display() }
注意:上述拼接逻辑不会影响Outlook默认自动签名的加载,签名会正常保留在回复邮件的最末尾。
内容的提问来源于stack exchange,提问作者Austin Sheppard
相关产品推荐
相关产品推荐

