1. 程式人生 > >springboot mail+Thymeleaf模板

springboot mail+Thymeleaf模板

from ann () ria sage code pool color final

compile ‘org.springframework.boot:spring-boot-starter-thymeleaf‘
compile ‘io.ratpack:ratpack-thymeleaf:1.4.2‘

import me.ele.api.portal.api.dto.ApiPortalOperator;
import me.ele.elog.Log;
import me.ele.elog.LogFactory;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.mail.javamail.MimeMessagePreparator; import org.springframework.stereotype.Service; import
org.thymeleaf.TemplateEngine; import org.thymeleaf.context.WebContext; import ratpack.thymeleaf.internal.ThymeleafHttpServletRequestAdapter; import ratpack.thymeleaf.internal.ThymeleafHttpServletResponseAdapter; import ratpack.thymeleaf.internal.ThymeleafServletContextAdapter; import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.beans.PropertyDescriptor; import java.lang.reflect.Method; import java.util.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.FutureTask; /** * Created by hujunzheng on 17/9/8. */ @Service public class MailService { @Autowired private MailProperties mailProperties; @Autowired private JavaMailSender javaMailSender; @Autowired private TemplateEngine templateEngine; private static final Log log = LogFactory.getLog(MailService.class); /** * 發送郵件 * @param userEmail * @param templateId */ public void sendMail(String userEmail, Map<String, Object> params, int templateId) { sendMailMultiParams(new String[] {userEmail}, params, templateId); } public void sendMail(String userEmail, Object obj, int templateId) { Map<String, Object> params = objectToMap(obj); sendMailMultiParams(new String[] {userEmail}, params, templateId); } public void sendMail(String userEmail, String message, String subject) { sendSampleMail(new String[] {userEmail}, message, subject); } public void sendMail(String[] userEmails, Map<String, Object> params, int templateId) { sendMailMultiParams(userEmails, params, templateId); } public void sendMail(String[] userEmails, Object obj, int templateId) { Map<String, Object> params = objectToMap(obj); sendMailMultiParams(userEmails, params, templateId); } public void sendMail(String[] userEmails, String message, String subject) { sendSampleMail(userEmails, message, subject); } private Map<String, Object> objectToMap(Object obj) { PropertyDescriptor[] propertyDescriptors = BeanUtils.getPropertyDescriptors(obj.getClass()); Map<String, Object> params = new HashMap<>(); for (PropertyDescriptor property : propertyDescriptors) { String key = property.getName(); if (key.compareToIgnoreCase("class") == 0) { continue; } Optional<Method> getter = Optional.ofNullable(property.getReadMethod()); try { Object value = getter.isPresent() ? getter.get().invoke(obj) : null; params.put(key, value); } catch (ReflectiveOperationException e) { e.printStackTrace(); } } return params; } /** * 異步 分別發送 發送郵件 * */ public List<String> asynSendMails(List<ApiPortalOperator> apiPortalOperators, Object bodyParams) { ExecutorService executorService = Executors.newFixedThreadPool(10); List<FutureTask<String>> futureTasks = new ArrayList<>(); for (ApiPortalOperator apiPortalOperator : apiPortalOperators) { FutureTask<String> futureTask = new FutureTask(() -> { try { this.sendMail(apiPortalOperator.getEmail(), bodyParams, 1); } catch (Exception e) { return "郵件to " + apiPortalOperator.getEmail() + " 發送異常:" + e.getMessage(); } return "郵件to " + apiPortalOperator.getEmail() + " 發送成功"; }); futureTasks.add(futureTask); executorService.submit(futureTask); } List<String> result = new ArrayList<>(); for (int i=0; i<futureTasks.size(); ++i) { FutureTask futureTask = futureTasks.get(i); try { result.add((String) futureTask.get()); } catch (Exception e) { result.add("to " + apiPortalOperators.get(i).getEmail() + " 發送失敗:" + e.getMessage()); } } return result; } /** * 異步 多個收件人一起 發送郵件 * */ public String asynSendMail(List<ApiPortalOperator> apiPortalOperators, Object bodyParams) { ExecutorService executorService = Executors.newSingleThreadExecutor(); String[] userEmails = apiPortalOperators.stream().map(ApiPortalOperator::getEmail).toArray(String[]::new); FutureTask<String> futureTask = new FutureTask(() -> { try { this.sendMail(userEmails, bodyParams, 1); } catch (Exception e) { return "郵件to " + StringUtils.join(userEmails, ‘,‘) + " 發送異常:" + e.getMessage(); } return "郵件to " + StringUtils.join(userEmails, ‘,‘) + " 發送成功"; }); executorService.submit(futureTask); try { return futureTask.get(); } catch (Exception e) { e.printStackTrace(); return "郵件to " + StringUtils.join(userEmails, ‘,‘) + " 發送異常:" + e.getMessage(); } } private void sendSampleMail(String[] userEmail, String msg, String subject) { MimeMessagePreparator preparator = new MimeMessagePreparator() { @Override public void prepare(MimeMessage mimeMessage) throws Exception { MimeMessageHelper message = new MimeMessageHelper(mimeMessage, "utf-8"); message.setTo(userEmail); message.setFrom(new InternetAddress(mailProperties.getFrom())); message.setSubject(subject); message.setText(msg); } }; try { this.javaMailSender.send(preparator); } catch (Exception ex) { log.error("Mailing Exception! user email is: {}", userEmail, ex); } log.info("Mail sent successfully, user email is: {}", userEmail); } private String buildTemplateMessage(String templateName, Map<String, Object> messages) { HttpServletRequest request = new ThymeleafHttpServletRequestAdapter(); HttpServletResponse response = new ThymeleafHttpServletResponseAdapter(); ServletContext servletContext = new ThymeleafServletContextAdapter(); WebContext context = new WebContext(request, response, servletContext); context.setVariables(messages); return templateEngine.process(templateName, context); } /** * 當發郵件時有多個不定參數時 * @param userEmail 用戶郵箱 * @param params 發郵件的參數 * @param templateId */ private void sendMailMultiParams(String[] userEmail, Map<String, Object> params, Integer templateId) { String templateName = MailTemplate.getTemplateName(templateId); MimeMessagePreparator preparator = new MimeMessagePreparator() { @Override public void prepare(MimeMessage mimeMessage) throws Exception { MimeMessageHelper message = new MimeMessageHelper(mimeMessage, "utf-8"); message.setTo(userEmail); message.setFrom(new InternetAddress(mailProperties.getFrom())); message.setSubject(MailTemplate.getTemplateSubject(templateId)); String content = buildTemplateMessage(templateName, params); System.out.println(content); message.setText(content, true); } }; try { this.javaMailSender.send(preparator); } catch (Exception ex) { log.error("Mailing Exception! user email is: {}, template params are: {}, template_id is: {}", userEmail, params.toString(), templateId, ex); } log.info("Mail sent successfully, user email is: {}, template params: {}, template_id is: {}", userEmail, params.toString(), templateId); } }

Thymeleaf 中有 plain context (不支持對url參數的解析)和 web context(支持對url參數的解析)

We‘ll have to change our code to create a web context, instead of a plain context. Change will be here: 

參考:https://github.com/ratpack/ratpack/blob/master/ratpack-thymeleaf/src/main/java/ratpack/thymeleaf/Template.java#L69-69

The IWebContext interface seems coupled to the servlet API, but after quick look at the code I don‘t think this will be a problem. I think we can just provide null values for things like request/session etc. that we can‘t provide. If that turns out to be a problem… we can look at providing implementations of those Servlet API type in so far makes sense.

springboot mail+Thymeleaf模板