Freemarker在ftl上嵌入图像

时间:2017-07-26 01:49:05

标签: java image email embed freemarker

我正在尝试在Freemarker ftl模板上嵌入图片以作为电子邮件发送,我已根据此问题Feemarker writing images to html,我做了与此问题完全相同的事情,但电子邮件正在生成this

可能导致此错误的原因以及如何解决此问题?

我的模板看起来像这样

<img alt="My image" src="${imgAsBase64}" />

图像是一个图表,我通过Primefaces JavaScript函数获取Base64字符串,我称之为imageBase64Str,它生成图表图像的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 个答案:

答案 0 :(得分: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/一些主要的电子邮件客户端,网络和独立电子邮件客户端(包括Gmail和Outlook)不支持Base64嵌入式图像。鉴于他们是最常见的电子邮件客户端,您不希望提供无法解决这些问题的解决方案,否则您的大多数用户都会感到不快。

IMO最好的办法是在服务器中托管图像,并在freemarker模板中使用完全限定的网址。

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