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

如何通过PowerShell脚本为Outlook外发邮件添加Microsoft统一标签?

解决Outlook PowerShell脚本添加敏感度标签的错误

错误根源分析

你遇到的两个错误本质上是用错了添加敏感度标签的方式:

  1. 第一个错误:olText是Outlook COM对象的枚举常量,直接作为字符串传递会触发类型转换失败。但核心问题是,UserProperties.Add用于添加自定义用户属性,而Microsoft统一标签(敏感度标签)是Outlook的内置MAPI属性,不能通过这个方法添加。
  2. 第二个错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 08:55:24