【问题标题】:How to send email with Freemarker template in Spring Boot app?如何在 Spring Boot 应用程序中使用 Freemarker 模板发送电子邮件?
【发布时间】:2021-10-13 02:31:58
【问题描述】:

我正在尝试使用 Freemarker 模板发送电子邮件。

代码:

public String geContentFromTemplate(Map<String, Object> model) throws IOException, TemplateException {
        StringWriter stringWriter = new StringWriter();
        fmConfiguration.getTemplate("email-template.ftlh").process(model, stringWriter);
        return stringWriter.getBuffer().toString();
}

public void sendEmailWithTemplate(String to, String subject, User user) {
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        try {

            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);

            mimeMessageHelper.setSubject(subject);
            mimeMessageHelper.setFrom(emailFrom);
            mimeMessageHelper.setTo(to);
            Map<String, Object> model = new HashMap<>();
            model.put("firstName", user.getFirstName());
            model.put("lastName", user.getLastName());
            String content = geContentFromTemplate(model);
            mimeMessageHelper.setText(content, true);

            mailSender.send(mimeMessageHelper.getMimeMessage());
        } catch (MessagingException | IOException | TemplateException e) {
            e.printStackTrace();
        }
    }

Freemarker 豆:

 @Bean
    public FreeMarkerConfigurationFactoryBean getFreeMarkerConfiguration() {
        FreeMarkerConfigurationFactoryBean fmConfigFactoryBean = new FreeMarkerConfigurationFactoryBean();
        fmConfigFactoryBean.setTemplateLoaderPath("classpath:templates/email-template.ftlh");
        return fmConfigFactoryBean;
    }

我的模板位于 Spring Boot 应用程序中:resources/templates/email-template.ftlh

我收到此异常: freemarker.template.TemplateNotFoundException: Template not found for name "email-template.ftlh". The name was interpreted by this TemplateLoader: org.springframework.ui.freemarker.SpringTemplateLoader@33cceeb3.

【问题讨论】:

  • 是基于spring资源系统的,所以我觉得代码中的路径应该是classpath:templates/email-template.ftlh之类的。假设“资源”是指 src/main/resources。
  • @Gimby 遇到同样的错误:freemarker.template.TemplateNotFoundException: Template not found for name "classpath:templates/email-template.ftlh" 我已将我的 Freemarker Bean 添加到帖子
  • 是的,所以 setTemplateLoaderPath 可能是 classpath:templates
  • 几天没有反馈。这是解决方案还是您以其他方式解决了它?
  • @Gimby 抱歉反馈迟了。我仍然有同样的问题。(更新了 setTemplateLoarderPath

标签: spring-boot jakarta-mail html-email freemarker


【解决方案1】:

我通过更改 @Bean 解决了这个问题。我删除了前一个并创建了另一个:

  @Bean
    public FreeMarkerConfigurer freeMarkerConfigurer(){
        freemarker.template.Configuration configuration = new freemarker.template.Configuration(freemarker.template.Configuration.VERSION_2_3_19);
        TemplateLoader templateLoader = new ClassTemplateLoader(this.getClass(), "/templates/");
        configuration.setTemplateLoader(templateLoader);
        FreeMarkerConfigurer freeMarkerConfigurer = new FreeMarkerConfigurer();
        freeMarkerConfigurer.setConfiguration(configuration);
        return freeMarkerConfigurer;
    }

模板加载也是这样实现的:

            Template template = freeMarkerConfigurer.getConfiguration().getTemplate("email-template.ftlh");
            String htmlBody = FreeMarkerTemplateUtils.processTemplateIntoString(template, model);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多