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
额外验证步骤
- 检查
$ImageBits的完整性:临时将Base64字符串输出到日志,对比本地转换的图片Base64是否一致,排除截断或编码错误 - 确认
Get-Content使用-AsByteStream参数(PowerShell 7+支持),避免因字符编码导致Base64异常
原理说明
新版Outlook和OWA要求HTML元素的属性值必须用引号包裹,且data:image URI不能有多余的转义字符。原代码中提前构建的标签经过HtmlDecode后,可能丢失引号或引入无效转义,导致客户端无法解析URI。上述方案通过直接生成标准格式的HTML标签,避免二次转义,符合新版客户端的解析规则。
内容的提问来源于stack exchange,提问作者webixe
相关产品推荐
相关产品推荐

