Freemarker 在 ftl 上嵌入图像

Posted

技术标签:

【中文标题】Freemarker 在 ftl 上嵌入图像【英文标题】:Freemarker embed image on ftl 【发布时间】:2018-01-01 03:15:38 【问题描述】:

我正在尝试在 Freemarker ftl 模板上嵌入图像以作为电子邮件发送,我基于这个问题 Feemarker writing images to html,我做了与这个问题所说的完全相同的事情,但是电子邮件正在生成,如this

什么可能导致此错误,以及如何解决?

我的模板是这样的

<img  src="$imgAsBase64" />

图像是一个图表,我通过 Primefaces javascript 函数获取了一个名为 imageBase64Str 的 Base64 字符串,该函数生成图表图像的 Base64,我将它传递给 bean 并将参数传递给模板,例如这个

String encoded = imageBase64Str.split(",")[1];
byte[] decoded = Base64.decodeBase64(encoded);
String imgDataAsBase64 = new String(decoded);
String imgAsBase64 = "data:image/png;base64," + imgDataAsBase64;
emailParams.put("imgAsBase64", imgAsBase64);

【问题讨论】:

您需要分享您的代码以供他人修复。 刚刚包含代码,感谢您的建议 我已经更新了答案 【参考方案1】:

String encoded = imageBase64Str.split(",")[1]; 很可疑。看起来您正在更改以某种不同方式生成的 base 64 字符串。图像实际上是 png 还是其他格式?我认为,如果您删除该拆分并仅执行emailParams.put("imgAsBase64", imageBase64Str); 它可能会起作用。

但是,您需要考虑到此解决方案不适用于许多电子邮件客户端。根据此链接https://www.campaignmonitor.com/blog/email-marketing/2013/02/embedded-images-in-html-email/ Base64 嵌入式图像在一些主要的电子邮件客户端、Web 和独立电子邮件客户端(包括 Gmail 和 Outlook)上不受支持。鉴于它们是最常见的电子邮件客户端,您不想提供对它们不起作用的解决方案,否则您的大多数用户都会不满意。

IMO 您最好的选择是将图像托管在服务器中,并在您的 freemarker 模板中使用完全限定的 URL。

另一种方法是使用附件并在 html 源中引用它们,如下所述:https://***.com/a/36870709/2546299 但它需要更改电子邮件的发送方式(需要添加附件),因此它可能不适合您的情况.

【讨论】:

嗨@Joao Victor Oliveira Santos,我的回答对您有帮助吗? 抱歉耽搁了,代码是正确的,问题是,正如你所指出的,大多数大型电子邮件提供商不支持 Base64 图像。解决方案是在服务器中托管图像并按照您的建议使用 html

以上是关于Freemarker 在 ftl 上嵌入图像的主要内容,如果未能解决你的问题,请参考以下文章

Java 使用 freemarker 模板引擎的相关疑问 ,求大神走过路过不要错过

FreeMarker之FTL指令

将代码freemarker执行成freemarker ftl

Freemarker 模板错误

使用 FreeMarker 在 Liferay 主题中显示图像

FTL(FreeMarker)基础