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

PowerShell ConvertTo-Html生成的图片在新版Outlook(Copilot)中显示异常

问题分析与解决方案

核心问题

新版Outlook(Copilot版)和OWA对HTML表格内的data:image URI解析规则更严格,导致你通过ConvertTo-Html生成的表格中,Base64格式的用户头像无法正常显示,但邮件顶部的同格式图片不受影响。旧版Outlook解析宽松所以无异常,且你明确不想使用CID嵌入方式。

解决方案

方案1:避免提前构建HTML标签(推荐)

不要提前生成<img>标签并存入对象,而是在ConvertTo-Html阶段动态构建,避免多次转义导致格式异常。

修改用户状态数组生成代码

$u | ForEach-Object {
    # 仅存储原始数据,不提前生成HTML标签
    $userstatus += [pscustomobject]@{
        PhotoBase64 = if($image) { $ImageBits } else { $noimagebase64 }
        PhotoType = if($image) { "jpg" } else { "jpg" }
        Name = $username
        Email = $u -join";"
        OutlookEnabled = ($getnoe).OneWinNativeOutlookEnabled -eq "True"
        License = $getlicense.SkuPartNumber -join";"
        UserDevice = $device.DeviceName
        Groupe_Policy = $Groupe_Policy
    }
}

修改表格生成代码

$tableuser = $userstatus | ConvertTo-Html -Fragment -As Table -Property `
    @{Name='Photo'; Expression={ 
        $src = "data:image/$($_.PhotoType);base64,$($_.PhotoBase64)"
        "<img height='72' width='72' src='$src' />"
    }},
    Name, Email,
    @{Name='Outlook'; Expression={
        if($_.OutlookEnabled) {
            "<img height='25' width='25' src='data:image/png;base64,$minigreencheck' />"
        } else {
            "FALSE"
        }
    }},
    License, UserDevice, Groupe_Policy | Out-String

# 无需额外HtmlDecode,直接生成符合要求的HTML片段

方案2:修复原代码的URI格式问题

如果坚持提前构建HTML标签,需要确保src属性格式完全符合新版客户端要求,且避免二次转义。

修改图片获取代码

Try{  
    Get-MgUserPhotoContent -UserId $u -OutFile "c:\temp\$u.jpg" -ErrorAction stop
    $image = Get-ChildItem "c:\temp\$u.jpg" -ErrorAction stop
    $ImageBits = [Convert]::ToBase64String((Get-Content $image -AsByteStream))
}
Catch{
    Write-Verbose "No photo found for $u"
}

# 直接生成带引号的标准img标签,不使用HTML实体转义
if(-not $image){
  $ImageHTML = '<img height="72" width="72" src="data:image/jpg;base64,' + $noimagebase64 + '" />'
}
else{
  $ImageHTML = '<img height="72" width="72" src="data:image/jpg;base64,' + $ImageBits + '" />'
}

if(($getnoe).OneWinNativeOutlookEnabled -eq "True"){
  $check = '<img height="25" width="25" src="data:image/png;base64,' + $minigreencheck + '" />'
}
else{
  $check = "FALSE"
}

修改表格生成代码

# 移除HtmlDecode步骤,避免破坏已正确构建的HTML标签
$tableuser = $userstatus | ConvertTo-Html -Fragment -As Table | Out-String

额外验证步骤

  1. 检查$ImageBits的完整性:临时将Base64字符串输出到日志,对比本地转换的图片Base64是否一致,排除截断或编码错误
  2. 确认Get-Content使用-AsByteStream参数(PowerShell 7+支持),避免因字符编码导致Base64异常

原理说明

新版Outlook和OWA要求HTML元素的属性值必须用引号包裹,且data:image URI不能有多余的转义字符。原代码中提前构建的标签经过HtmlDecode后,可能丢失引号或引入无效转义,导致客户端无法解析URI。上述方案通过直接生成标准格式的HTML标签,避免二次转义,符合新版客户端的解析规则。

内容的提问来源于stack exchange,提问作者webixe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 03:16:33