2013-02-06 11 views
6

Próbuję użyć Thymeleaf szablon dla aplikacji wiosennej do wysyłania poczty, Biorę odniesienia stąd https://github.com/thymeleaf/thymeleafexamples-springmail/Korzystanie thymeleaf szablon do wysyłania poczty z wiosny

ja nie otrzymuję żadnych błędów, ale nadal to robi” t działa .. Używam tego samego kodu, co w githubie, ale nie ma szczęścia ... Czy ktoś może zasugerować, jak to zrobić?

Po to metoda, która służy do wysyłania poczty ...

public void sendSimpleMail(
     final String recipientName, final String recipientEmail, final Locale locale) 
     throws MessagingException { 
    final Context ctx = new Context(locale); 
    ctx.setVariable("name", recipientName); 
    ctx.setVariable("subscriptionDate", new Date()); 
    ctx.setVariable("hobbies", Arrays.asList("Cinema", "Sports", "Music")); 
    final MimeMessage mimeMessage = this.mailSender.createMimeMessage(); 
    final MimeMessageHelper message = new MimeMessageHelper(mimeMessage, "UTF-8"); 
    message.setSubject("Example HTML email (simple)"); 
    message.setFrom("[email protected]"); 
    message.setTo(recipientEmail); 
    // Create the HTML body using Thymeleaf 
    final String htmlContent = this.templateEngine.process("email-simple.html", ctx); 
    message.setText(htmlContent /* isHtml */); 

    // Send email 
    System.out.println("........"); 
    this.mailSender.send(mimeMessage); 
} 

Jeśli usunąć wiersz, który je utworzył ciało HTML przy użyciu thymeleaf i wysłać zwykłym listem to działa, ale nie z szablonem ..

jest to linia, która powoduje problem ... po prostu przekierować do strony błędu

final String htmlContent = this.templateEngine.process("email-simple.html", ctx); 

Poniżej znajduje się błąd ja dostaję ..

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] 
    at org.thymeleaf.resourceresolver.ServletContextResourceResolver.getResourceAsStream(ServletContextResourceResolver.java:74) 
    at org.thymeleaf.TemplateParser.parseDocument(TemplateParser.java:254) 
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:812) 
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:769) 
    at com.ivb.coep.other.EmailService.sendSimpleMail(EmailService.java:72) 
    at com.ivb.coep.controller.MainController.sendTextMail(MainController.java:83) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:213) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 

Odpowiedz

8

mam to działa w końcu ... Zmieniłem następującą linię

final Context ctx = new Context(locale); 

z

final WebContext ctx = new WebContext(request,request.getContext(),locale); 

Teraz jestem w stanie wysłać dowolny szablon lub przywiązanie wszystko działa świetnie .. !!

+4

wiem, że to jest stary odpowiedź, ale jeden powód, aby nie iść tą drogą jest to, że będziesz uzależniony od wniosku jako @real gadha wymienione. Może to być w porządku dla aplikacji testowej, ale jeśli później użyjesz struktury SpringEnd ApplicationEvent do nasłuchiwania zdarzeń i wysyłania e-maili podczas wykonywania innej logiki, możesz nie mieć dostępu do żądania. – bphilipnyc

3

Otrzymujesz ten problem, ponieważ wygląda na to, że nie masz folderu pocztowego w folderze WEB-INF/classes.

Zgodnie z konfiguracją wymienioną poniżej spodziewa się folderu pocztowego w folderze WEB-INF/classes.

<bean id="emailTemplateResolver"  class="org.thymeleaf.templateresolver.ClassLoaderTemplateResolver"> 
    <property name="prefix" value="mail/" /> 
    <property name="templateMode" value="HTML5" /> 
    <property name="characterEncoding" value="UTF-8" /> 
    <property name="order" value="1" /> 
    <!-- Template cache is true by default. Set to false if you want --> 
    <!-- templates to be automatically updated when modified.  --> 
    <property name="cacheable" value="true" /> 
</bean> 

Stwórz więc folder z nazwą "mail" wewnątrz folderu "resouces" i zachowaj szablony wiadomości w folderze "mail". Upewnij się, że masz ten folder "mail" w folderze WEB-INF/classes podczas wdrażania. To powinno rozwiązać Twój problem.

IMO, nie powinniśmy używać WebContextu, ponieważ wymaga on obiektu "request" i silnego sprzężenia poczty z żądaniem nie jest dobrym pomysłem.

0

Jeśli chcesz zlokalizować szablony gdzieś poniżej/WEB-INF/ale nie chcesz używać ServletContextTemplateResolver, spróbuj SpringResourceTemplateResolver, np.

TemplateResolver templateResolver = new SpringResourceTemplateResolver(); 
templateResolver.setPrefix("/WEB-INF/mailtemplates/");