如何通过PowerShell脚本为Outlook外发邮件添加Microsoft统一标签?
解决Outlook PowerShell脚本添加敏感度标签的错误
错误根源分析
你遇到的两个错误本质上是用错了添加敏感度标签的方式:
- 第一个错误:
olText是Outlook COM对象的枚举常量,直接作为字符串传递会触发类型转换失败。但核心问题是,UserProperties.Add用于添加自定义用户属性,而Microsoft统一标签(敏感度标签)是Outlook的内置MAPI属性,不能通过这个方法添加。 - 第二个错误:Outlook自定义用户属性的名称不允许包含下划线
_,这是COM对象的硬性限制,就算解决了olText的问题,也会因为属性名里的_报错。
正确实现代码
要添加敏感度标签,需使用Outlook的PropertyAccessor设置对应的MAPI属性,代码如下:
Function outlookSend { param( [string]$recipient, [string]$subject, [string]$body, [string]$labelGuid # 替换为你的标签GUID ) $outlook = New-Object -ComObject Outlook.Application -Verbose:$false $message = $outlook.CreateItem(0) # 0对应olMailItem枚举值 # 设置邮件基础信息 $message.To = $recipient $message.Subject = $subject $message.HtmlBody = $body # 构建敏感度标签的MAPI属性名称 $enabledProp = "http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/MSIP_Label_$($labelGuid)_Enabled" # 设置标签启用状态为True $message.PropertyAccessor.SetProperty($enabledProp, "True") # 可选:设置标签显示名称(如需在邮件中显示标签名) $displayNameProp = "http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/MSIP_Label_$($labelGuid)_DisplayName" $message.PropertyAccessor.SetProperty($displayNameProp, "私密") # 替换为你的标签显示名 $message.Send() # 清理COM对象,避免内存泄漏 [System.Runtime.Interopservices.Marshal]::ReleaseComObject($message) | Out-Null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($outlook) | Out-Null [GC]::Collect() [GC]::WaitForPendingFinalizers() }
关键说明
- 敏感度标签的MAPI属性名称格式固定,其中
{00020329-0000-0000-C000-000000000046}是Outlook通用命名空间ID,无需修改。 - 无需调用
$message.GetInspector.Activate(),该操作对添加标签无作用,还可能引发不必要的COM对象交互。 - 必须清理COM对象,避免PowerShell进程残留Outlook实例导致资源泄漏。
内容的提问来源于stack exchange,提问作者klein
相关产品推荐
相关产品推荐

