Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Thymeleaf富HTML电子邮件错误_Java_Eclipse_Spring_Html Email_Thymeleaf - Fatal编程技术网

Java Thymeleaf富HTML电子邮件错误

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

首先,我已经阅读了有关thymeleaf电子邮件渲染的所有问题,我的意思是,原始教程:

还有其他关于这个的问题,问题是我找不到一个合适的解决方案,开始让人恼火。。。那么,拜托,你能帮我吗

问题是,对于许多人来说,我希望发送丰富的HTML电子邮件,以下是我的ThymileAF配置:

@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个不同配置选项