如何使用JavaMail将图像添加到Freemarker模板

时间:2019-02-01 12:50:18

标签: java spring spring-data javamail freemarker

现在在此问题被标记为重复之前, Add image to freemarker template for mail?

此问题未提供我的问题的解决方案。 因此,我想在Freemarker HTML模板中添加图像作为背景,并将其附加到Java的Google Gmail API程序中。

以下是Freemarker的代码:-

<style>
    body{
background-image: url("cid:${image.jpg}");
}
     .container {
              position: absolute;
              padding:25px;
              margin:25px;
              border:5px;
              text-align: justify;
              text-justify: inter-word;
              font-family: "Times New Roman";
              font-style: italic;
            }
 </style>

我使用Google Gmail API插入图像的方式是:-

Multipart multipart = new MimeMultipart();
    MimeBodyPart bodyPart = new MimeBodyPart();
    Template t = freemarkerTemlate.getTemplate("OneEmployee.ftl");
    String mailContent = FreeMarkerTemplateUtils.processTemplateIntoString(t, model);
    bodyPart.setContent(mailContent, "text/html");
    multipart.addBodyPart(bodyPart);

    DataSource fds = new FileDataSource(Mailer.class.getClassLoader().getResource("images/image1.jpg").getFile());
    bodyPart = new MimeBodyPart();
    bodyPart.setDataHandler(new DataHandler(fds));
    bodyPart.setHeader("Content-ID", "<image.jpg>");
    multipart.addBodyPart(bodyPart);

我的图像位于资源目​​录中,该目录包含另一个图像目录

现在我已经尝试了几乎所有可能的代码变体,例如使用

<img src="">

添加CID:内的$ {},并且还没有使用“”,但它似乎没有设置Image在任何情况下。

在某些情况下,它运行时没有附加映像,在某些情况下,它运行但在控制台上也会引发错误:-

Application failed at {image1.jpg}:- Missing or Null Argument 

我正在使用的模型是:-

 Map model = new HashMap();
 model.put("emailNames", emailNames);

我没有在模型中添加任何其他内容,因为这是我要插入到freemarker模板中的图像之外唯一的东西

我做错了什么还是错过了吗?

编辑2

我也尝试通过将Model设置为Key来通过Model插入Image 附加了代码以供参考

Map model = new HashMap();
 model.put("emailNames", emailNames);
 model.put("image.jpg", Mailer.class.getClassLoader().getResource("images/image1.jpg").getFile())

它仍然无法工作!

编辑2

有趣的是我注意到,当我不限定cid,则它增加了背景图像作为附件,但每当我加入cid语法它不添加作为附件,但它只是忽略邮件。

我在网上阅读到,根据教程,您没有将要插入的Image作为模型的一部分传递,而是将其添加为定义Image的content_id(cid)的附件。

谢谢

1 个答案:

答案 0 :(得分:0)

所以最终我能够得到解决方案的答案

我从“资源”中的“图像”文件夹加载图像的方式是错误的

File file = new ClassPathResource("image").getFile();

这是做到这一点的方法 然后,将其传递给Freemarker模板时,您只需要做cid:imageURL就可以了。

还应遵循@Bill Shannon和@Mark Rotteveel的评论