PowerShell调用Outlook发信时设置HTMLBody导致签名丢失如何解决?
解决方案
原因说明
直接对$Mail.HTMLBody赋值会覆盖Outlook默认填充的包含签名的完整HTML内容,导致签名丢失。Outlook创建新邮件实例后,首次访问HTMLBody属性时才会自动将当前账户配置的默认签名写入该属性中。
方案1:直接在默认签名基础上追加自定义内容(推荐)
调整代码顺序,先触发Outlook填充默认签名,再将自定义内容插入到原有HTML内容的合适位置,示例代码如下:
$Msg = "<span style='font-family:Calibri;font-size:12pt;'>Sehr geehrte Damen und Herren<br><br></span>" $Outlook = New-Object -ComObject Outlook.Application $namespace = $Outlook.GetNameSpace("MAPI") $namespace.Logon($null, $null, $false, $true) $EmailFrom = 'test@test.com' $account = $Outlook.Session.Accounts.Item($EmailFrom) $Mail = $Outlook.CreateItem(0) # 先绑定发件人账户,确保加载对应账户的签名 $Mail.SendUsingAccount = $account # 首次访问HTMLBody,触发Outlook自动填充默认签名 $signature = $Mail.HTMLBody # 将自定义内容拼接到签名前,也可以根据需要修改插入位置 $Mail.HTMLBody = $Msg + $signature # 后续其他邮件配置(收件人、主题等) # $Mail.To = "xxx@xxx.com" # $Mail.Subject = "测试主题" # $Mail.Display() # 预览邮件 # $Mail.Send() # 直接发送 # 释放COM对象,避免残留Outlook进程 [System.Runtime.Interopservices.Marshal]::ReleaseComObject($Mail) | Out-Null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($account) | Out-Null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($namespace) | Out-Null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($Outlook) | Out-Null [System.GC]::Collect() [System.GC]::WaitForPendingFinalizers()
方案2:手动读取签名文件加载
如果需要使用非默认签名,或者需要更灵活控制签名加载逻辑,可以直接读取Outlook签名存储目录下的.htm文件内容,手动拼接到邮件内容中:
# 签名默认存储路径,将「你的签名名称」替换为实际的签名名 $signaturePath = Join-Path $env:APPDATA "Microsoft\Signatures\你的签名名称.htm" $signatureContent = Get-Content -Path $signaturePath -Raw -Encoding UTF8 $Msg = "<span style='font-family:Calibri;font-size:12pt;'>Sehr geehrte Damen und Herren<br><br></span>" # 直接拼接自定义内容和签名 $Mail.HTMLBody = $Msg + $signatureContent
注意事项
- 若方案1读取的
HTMLBody为空,请检查对应Outlook账户是否已经配置了默认的新邮件签名。 - 拼接HTML内容时建议在自定义内容末尾添加换行标签
<br><br>,避免内容和签名挤在一起。
内容的提问来源于stack exchange,提问作者ASD
相关产品推荐
相关产品推荐

