我正在使用Thymeleaf SpringTemplateEngine在我的Spring应用程序上创建HTML电子邮件。当我使用纯Spring MVC时,一切都很完美。现在使用Spring Boot,该类找不到我的.html模板。我认为问题出在ServletContext,它没有返回正确的路径,但是我不知道如何解决它。所以我应该使用另一个上下文来处理模板吗?哪一个?
这是我的MailService,用于纯Spring MVC。
@Service public class MailService { private JavaMailSenderImpl mailSender; private SpringTemplateEngine templateEngine; public MailService() { mailSender = new JavaMailSenderImpl(); //mailSender config templateEngine = new SpringTemplateEngine(); Set<ITemplateResolver> templatesResolvers = new HashSet<ITemplateResolver>(); ClassLoaderTemplateResolver emailTemplateResolver = new ClassLoaderTemplateResolver(); emailTemplateResolver.setPrefix("mail/"); emailTemplateResolver.setTemplateMode("HTML5"); emailTemplateResolver.setCharacterEncoding("UTF-8"); emailTemplateResolver.setOrder(1); templatesResolvers.add(emailTemplateResolver); ServletContextTemplateResolver webTemplateResolver = new ServletContextTemplateResolver(); webTemplateResolver.setPrefix("/mail/"); webTemplateResolver.setTemplateMode("HTML5"); webTemplateResolver.setCharacterEncoding("UTF-8"); webTemplateResolver.setOrder(2); templatesResolvers.add(webTemplateResolver); templateEngine.setTemplateResolvers(templatesResolvers); } public void sendReport(String nome, String email, String obra, long medicao, HttpServletRequest request, HttpServletResponse response, ServletContext context, Locale locale) throws MessagingException { String subject = "Novo relatório"; final WebContext ctx = new WebContext(request, response, context, locale); ctx.setVariable("nome", nome); ctx.setVariable("obra", obra); ctx.setVariable("data", DataUtils.getInstance().getDataString(medicao)); ctx.setVariable("logo", "logo.jpg"); final MimeMessage mimeMessage = this.mailSender.createMimeMessage(); final MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true, "UTF-8"); message.setSubject(subject); try { message.setFrom(new InternetAddress(mailSender.getUsername(), "Sistema")); } catch (UnsupportedEncodingException e) { } message.setTo(email); final String htmlContent = this.templateEngine.process( "email-relatorio.html", ctx); message.setText(htmlContent, true); try { File file = new File(context.getRealPath("app/img/logo-pro.jpg")); InputStreamSource imageSource = new ByteArrayResource( IOUtils.toByteArray(new FileInputStream(file))); message.addInline("logo.jpg", imageSource, "image/jpg"); } catch (IOException e) { e.printStackTrace(); } this.mailSender.send(mimeMessage); } }
错误:
org.thymeleaf.exceptions.TemplateInputException: Error resolving template "email-relatorio.html", template might not exist or might not be accessible by any of the configured Template Resolvers at org.thymeleaf.TemplateRepository.getTemplate(TemplateRepository.java:246) at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1104) at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1060) at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1011) at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:924) at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:898)
您正在使用Spring Boot,然后让Spring Boot完成已经完成的繁重工作。删除你的构造,简单@Autowire的JavaMailSender和SpringTemplateEngine。
@Autowire
JavaMailSender
SpringTemplateEngine
将邮件配置添加到中application.properties。
application.properties
spring.mail.host=your-mail-server spring.mail.port= spring.mail.username spring.mail.password
将百里香叶配置添加到application.properties
# THYMELEAF (ThymeleafAutoConfiguration) spring.thymeleaf.check-template-location=true spring.thymeleaf.prefix=classpath:/templates/ spring.thymeleaf.excluded-view-names= # comma-separated list of view names that should be excluded from resolution spring.thymeleaf.view-names= # comma-separated list of view names that can be resolved spring.thymeleaf.suffix=.html spring.thymeleaf.mode=HTML5 spring.thymeleaf.encoding=UTF-8 spring.thymeleaf.content-type=text/html # ;charset=<encoding> is added spring.thymeleaf.cache=true # set to false for hot refresh
如果您这样做了,就改变您的班级
@Service public class MailService { @Autowired private JavaMailSender mailSender; @Autowired private SpringTemplateEngine templateEngine; @Value("${spring.mail.username}") private String username; public void enviarRelatorio(String nome, String email, String obra,long medicao, Locale locale) throws MessagingException { String subject = "Novo relatório"; final Context ctx = new Context(locale); ctx.setVariable("nome", nome); ctx.setVariable("obra", obra); ctx.setVariable("data", DataUtils.getInstance().getDataString(medicao)); ctx.setVariable("logo", "logo.jpg"); final MimeMessage mimeMessage = this.mailSender.createMimeMessage(); final MimeMessageHelper message = new MimeMessageHelper(mimeMessage,true, "UTF-8"); message.setSubject(subject); message.setTo(email); try { message.setFrom(new InternetAddress(username, "Sistema")); } catch (UnsupportedEncodingException e) { } final String htmlContent = this.templateEngine.process( "email-relatorio", ctx); message.setText(htmlContent, true); try { message.addInline("logo.jpg", new FileSystemResource("imgs/logo-pro.jpg"), "image/jpg"); } catch (IOException e) { e.printStackTrace(); } this.mailSender.send(mimeMessage); } }