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

Velocity邮件模板中Base64图片无法显示的问题求助

解决Velocity邮件模板中Base64图片无法加载的问题

嘿,我之前做邮件模板时也踩过一模一样的坑,咱们一步步拆解解决你的问题:

先搞定最致命的小细节:多余空格

你代码里的data:image/jpg;base64, $src在逗号后面多了个空格,很多邮件客户端(比如Outlook、部分Web邮箱)对这个空格极度敏感,直接会导致Base64解析失败。先把空格去掉,改成:

<img src="data:image/jpg;base64,$src">

验证Base64字符串本身是否有效

你能在页面上看到$src的内容,说明Velocity能正确获取到值,但得确认这个Base64本身是可用的:

  • 把页面显示的Base64内容复制出来,本地用简单的解码工具(比如自己写几行Java代码解码)试试能不能生成正常图片。如果不行,说明后端生成Base64时就出问题了——比如没正确读取图片字节,或者用了带换行的Base64编码模式。

清理Base64里的换行符

如果后端用Java的Base64.encodeToString生成字符串,默认可能会插入换行符(比如Base64.DEFAULT模式),这些换行在邮件里会直接破坏Base64的结构。你可以在Velocity里提前替换掉:

#set ($imageBase64 = $ele.getImageBase64().replaceAll("\r|\n", ""))
<img src="data:image/jpg;base64,$imageBase64">

确保MIME类型完全匹配

注意标准的图片MIME类型:JPEG是image/jpeg(不是image/jpg,虽然部分客户端兼容,但尽量用标准写法),PNG是image/png。如果你的图片是PNG格式却写了image/jpg,也会导致加载失败。

优化Velocity表达式写法

直接在src里写$ele.getImageBase64()有时候会因为Velocity的解析优先级出问题,建议先把值赋值到变量里再用,同时加个非空判断避免空值异常:

#foreach( $ele in $list)
<tr>
    <td>$ele.getName()</td>
    <td>
        #set ($imageBase64 = $ele.getImageBase64())
        #if($imageBase64 && $imageBase64 != '')
            #set ($cleanBase64 = $imageBase64.replaceAll("\r|\n", ""))
            <img src="data:image/jpeg;base64,$cleanBase64" alt="$ele.getName()的图片">
        #else
            <span>无可用图片</span>
        #end
    </td>
    <td>$imageBase64</td>
</tr>
#end

按这个顺序排查下来,基本能解决大部分Base64图片加载失败的问题~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:33:53