如何在 Spring Boot 应用程序中使用 Freemarker 模板发送电子邮件?
Posted
技术标签:
【中文标题】如何在 Spring Boot 应用程序中使用 Freemarker 模板发送电子邮件?【英文标题】:How to send email with Freemarker template in Spring Boot app? 【发布时间】: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
【参考方案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);
【讨论】:
以上是关于如何在 Spring Boot 应用程序中使用 Freemarker 模板发送电子邮件?的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot 集成 Ehcache 缓存,三步搞定!
如何将基于 Spring Boot 构建的依赖项使用到典型的 Spring 应用程序中?
如何在 Spring-Boot 应用程序中使用 JavaScript 加入枚举
如何使用 CommandLineJobRunner 调用嵌入在 Spring Boot 应用程序中的 Spring Batch 作业