无法使用PowerShell变量设置Outlook的HTMLBody属性
解决PowerShell变量设置Outlook邮件HTMLBody为空的问题
问题重现
直接给HTMLBody赋值字符串可正常运行,但将HTML字符串存入变量后赋值,邮件正文始终为空:
# 正常运行的代码 $ol = New-Object -comObject Outlook.Application $mail = $ol.CreateItem(0) $mail.HTMLBody= "<html><head></head><body><p>Hello, World</p></body></html>" $mail.save() $inspector = $mail.GetInspector $inspector.Display() # 无法运行的代码(正文为空) $ol = New-Object -comObject Outlook.Application $mail = $ol.CreateItem(0) $body = "<html><head></head><body><p>Hello, World</p></body></html>" $mail.HTMLBody= $body $mail.save() $inspector = $mail.GetInspector $inspector.Display()
解决方案
方法1:强制转换变量为字符串类型
Outlook的COM对象对字符串类型要求严格,强制将变量转换为[string]类型后再赋值:
$ol = New-Object -comObject Outlook.Application $mail = $ol.CreateItem(0) $body = "<html><head></head><body><p>Hello, World</p></body></html>" $mail.HTMLBody = [string]$body # 强制转换类型 $mail.save() $inspector = $mail.GetInspector $inspector.Display()
方法2:使用COM对象的InvokeSet方法赋值
通过PowerShell的COM对象调用方法设置属性,规避类型绑定问题:
$ol = New-Object -comObject Outlook.Application $mail = $ol.CreateItem(0) $body = "<html><head></head><body><p>Hello, World</p></body></html>" $mail.PSObject.InvokeSet('HTMLBody', $body) # 使用InvokeSet赋值 $mail.save() $inspector = $mail.GetInspector $inspector.Display()
方法3:先初始化普通Body属性再覆盖HTMLBody
先给Body属性赋值触发正文初始化,再设置HTMLBody:
$ol = New-Object -comObject Outlook.Application $mail = $ol.CreateItem(0) $body = "<html><head></head><body><p>Hello, World</p></body></html>" $mail.Body = "Temp" # 初始化正文属性 $mail.HTMLBody = $body $mail.save() $inspector = $mail.GetInspector $inspector.Display()
原理说明
PowerShell 5中,直接赋值字符串字面量时会自动匹配COM对象期望的字符串类型,但存储在变量中的字符串可能因PowerShell类型推断机制,导致与Outlook COM对象的类型不兼容,通过强制转换或调用COM方法可解决该类型匹配问题。
内容的提问来源于stack exchange,提问作者Rno
相关产品推荐
相关产品推荐

