Java Thymeleaf富HTML电子邮件错误
首先,我已经阅读了有关thymeleaf电子邮件渲染的所有问题,我的意思是,原始教程: 还有其他关于这个的问题,问题是我找不到一个合适的解决方案,开始让人恼火。。。那么,拜托,你能帮我吗 问题是,对于许多人来说,我希望发送丰富的HTML电子邮件,以下是我的ThymileAF配置:Java Thymeleaf富HTML电子邮件错误,java,eclipse,spring,html-email,thymeleaf,Java,Eclipse,Spring,Html Email,Thymeleaf,首先,我已经阅读了有关thymeleaf电子邮件渲染的所有问题,我的意思是,原始教程: 还有其他关于这个的问题,问题是我找不到一个合适的解决方案,开始让人恼火。。。那么,拜托,你能帮我吗 问题是,对于许多人来说,我希望发送丰富的HTML电子邮件,以下是我的ThymileAF配置: @Configuration public class ThymeleafConfig { @Bean public ClassLoaderTemplateResolver emailTemplat
@Configuration
public class ThymeleafConfig {
@Bean
public ClassLoaderTemplateResolver emailTemplateResolver(){
ClassLoaderTemplateResolver emailResolver = new ClassLoaderTemplateResolver();
emailResolver.setPrefix("/WEB-INF/mailTemplates/");
emailResolver.setSuffix(".html");
emailResolver.setTemplateMode("HTML5");
emailResolver.setOrder(1);
return emailResolver;
}
@Bean
public ServletContextTemplateResolver webTemplateResolver() {
ServletContextTemplateResolver webResolver = new ServletContextTemplateResolver();
webResolver.setPrefix("/WEB-INF/templates/");
webResolver.setSuffix(".html");
webResolver.setTemplateMode("HTML5");
webResolver.setOrder(2);
return webResolver;
}
@Bean
public SpringTemplateEngine templateEngine() {
SpringTemplateEngine engine = new SpringTemplateEngine();
engine.addTemplateResolver(emailTemplateResolver());
engine.addTemplateResolver(webTemplateResolver());
engine.addDialect(new SpringSecurityDialect());
return engine;
}
@Bean
public ThymeleafViewResolver thymeleafViewResolver() {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setTemplateEngine(templateEngine());
resolver.setOrder(1);
return resolver;
}
}
在emailResolver.setPrefix(“/WEB-INF/mailTemplates/”)中;行,我尝试将原始示例配置改为
emailResolver.setPrefix(“/mail/”);
以及在eclipse项目中重新组织文件。现在是这样的
发送电子邮件的方法如下所示:
public void sendRegistrationEmail(String contextPath, Locale locale, User user) throws MessagingException{
String token = UUID.randomUUID().toString();
userService.createVerificationToken(user, token);
String recipientAddress = user.getEmail();
String subject = "Register";
String confirmationUrl = contextPath + "/regitrationConfirm.html?token=" + token;
String imageResourceName= "/images/myLogo.jpg";
final Context ctx = new Context(locale);
ctx.setVariable("name", user.getShownUsername());
ctx.setVariable("subscriptionDate", new Date());
ctx.setVariable("logo", imageResourceName);
ctx.setVariable("name", user.getShownUsername());
ctx.setVariable("loginName", user.getUsername());
ctx.setVariable("email", user.getEmail());
ctx.setVariable("link", confirmationUrl);
final String htmlContent = templateEngine.process("registrationTemplate", ctx);
final MimeMessage mimeMessage = this.mailSender.createMimeMessage();
final MimeMessageHelper message = new MimeMessageHelper(mimeMessage);
message.setFrom("<" + env.getProperty("email.username") + ">");
message.setTo("<" + recipientAddress + ">");
message.setSubject(subject);
message.setText(htmlContent,true);
mailSender.send(mimeMessage);
}
使用此参数:
resourceName = /WEB-INF/mailTemplates/registrationTemplate.html
templateName = registrationTemplate
resourceResolver.getName() = org.thymeleaf.resourceresolver.ClassLoaderResourceResolver
我很确定这个错误在一些配置或类似的东西中是很小的,我现在不知道在哪里搜索它
当它不使用ClassLoader呈现模板,然后尝试使用第二个renter模板Servlet模板时,会运行异常,并且会因以下众所周知的错误而崩溃:
Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateProcessingException: Resource resolution by ServletContext with org.thymeleaf.resourceresolver.ServletContextResourceResolver can only be performed when context implements org.thymeleaf.context.IWebContext [current context: org.thymeleaf.context.Context]] con causa raíz
org.thymeleaf.exceptions.TemplateProcessingException: Resource resolution by ServletContext with org.thymeleaf.resourceresolver.ServletContextResourceResolver can only be performed when context implements org.thymeleaf.context.IWebContext [current context: org.thymeleaf.context.Context]
有什么想法吗
我读过这种方法:
但是,让它与Thymeleaf示例这样的配置一起工作会很好,避免发送请求,等等
提前谢谢
编辑:
要添加更多信息,请使用以下电子邮件模板:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title th:remove="all">Registration Template</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p th:text="#{email.registration.greeting(${name})}">
Hello, Username!
</p>
<p>
Registering on <span th:text="${#dates.format(subscriptionDate)}">Date</span>.
</p>
<p>Your data:</p>
<ul th:remove="all-but-first">
<li th:text="#{email.registration.loginname(${loginName})}">Login: username</li>
<li th:text="#{email.registration.shownusername(${shownUserName})}">show name: UserName</li>
<li th:text="#{email.registration.email(${email})}">email: user@mail.com</li>
</ul>
<p>
Register link:
</p>
<p th:text="${link}"></p>
<p>
Thanks!
</p>
<p>
<img src="sample.png" th:src="'cid:' + ${logo}" />
</p>
</body>
</html>
注册模板
你好,用户名!
注册日期。
您的数据:
- Login:username
- 显示名称:用户名
- 电子邮件:user@mail.com
注册链接:
谢谢
我几乎可以肯定问题来自此配置:
ClassLoaderTemplateResolver emailResolver = new ClassLoaderTemplateResolver();
emailResolver.setPrefix("/WEB-INF/mailTemplates/");
ClassLoaderTemplateResolver emailResolver = new ClassLoaderTemplateResolver();
emailResolver.setPrefix("/mailTemplates/");
/在战争中,WEB-INF/mailTemplates不在类路径上。相反,将mailTemplates文件夹放在src/resources中。然后,它将被放在/WEB-INF/classes/的war中,您应该能够通过以下配置访问它们:
ClassLoaderTemplateResolver emailResolver = new ClassLoaderTemplateResolver();
emailResolver.setPrefix("/WEB-INF/mailTemplates/");
ClassLoaderTemplateResolver emailResolver = new ClassLoaderTemplateResolver();
emailResolver.setPrefix("/mailTemplates/");
编辑:
另一种解决方案是对电子邮件模板也使用ServletContextTemplateResolver:
ServletContextTemplateResolver emailResolver = new ServletContextTemplateResolver();
emailResolver.setPrefix("/WEB-INF/mailTemplates/");
这个解决方案解决了我的问题。但我还有一个问题。为什么webTemplateResolver使用下一行中的模板:webResolver.setPrefix(“/WEB-INF/templates/”);正确地我认为它也会以同样的方式起作用。。我是否应该更改此配置以避免出现问题?非常感谢。这是因为它是一个ServletContextTemplateResolver。事实上,您可以将电子邮件模板的ClassLoaderTemplateResolver替换为ServletContextTemplateResolver,并保留“/WEB-INF/mailTemplates/”电子邮件模板位置。明白!我将保持这种方式(2个解析器),除非只有一个有一些改进,但两种方式都是相同的,对吗?是的,它们只是模板所在位置的2个不同配置选项