/** * Copyright (c) 2018 人人开源 All rights reserved. * * https://www.renren.io * * 版权所有,侵权必究! */ package com.zt.modules.message.channel.email; import java.io.StringReader; import java.io.StringWriter; import java.util.Map; import java.util.Properties; import javax.mail.internet.MimeMessage; import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mail.javamail.JavaMailSenderImpl; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.stereotype.Component; import cn.hutool.core.map.MapUtil; import com.zt.common.constant.ExecuteStatus; import com.zt.common.exception.ErrorCode; import com.zt.common.exception.RenException; import com.zt.core.sys.service.ISysParamsService; import com.zt.modules.message.model.SysMailTemplate; import com.zt.modules.message.service.SysMailLogService; import com.zt.modules.message.service.SysMailTemplateService; import freemarker.template.Template; /** * 邮件工具类 * * @author Mark sunlightcs@gmail.com */ @Component public class EmailUtils { private Logger logger = LoggerFactory.getLogger(getClass()); @Autowired private ISysParamsService sysParamsService; @Autowired private SysMailTemplateService sysMailTemplateService; @Autowired private SysMailLogService sysMailLogService; public final static String MAIL_CONFIG_KEY = "MAIL_CONFIG_KEY";// 邮件配置KEY private JavaMailSenderImpl createMailSender(EmailConfig config) { JavaMailSenderImpl sender = new JavaMailSenderImpl(); sender.setHost(config.getSmtp()); sender.setPort(config.getPort()); sender.setUsername(config.getUsername()); sender.setPassword(config.getPassword()); sender.setDefaultEncoding("Utf-8"); Properties p = new Properties(); p.setProperty("mail.smtp.timeout", "10000"); p.setProperty("mail.smtp.auth", "false"); sender.setJavaMailProperties(p); return sender; } /** * 发送邮件 * * @param templateId * 模板ID * @param to * 收件人 * @param cc * 抄送 * @param params * 模板参数 * @return true:成功 false:失败 */ public boolean sendMail(Long templateId, String[] to, String[] cc, Map params) throws Exception { SysMailTemplate template = sysMailTemplateService.get(templateId); if (template == null) { throw new RenException(ErrorCode.MAIL_TEMPLATE_NOT_EXISTS.getCode()); } EmailConfig config = sysParamsService.getValueObject(MAIL_CONFIG_KEY, EmailConfig.class); JavaMailSenderImpl mailSender = createMailSender(config); MimeMessage mimeMessage = mailSender.createMimeMessage(); // 设置utf-8编码 MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8"); messageHelper.setFrom(config.getUsername()); // 收件人 messageHelper.setTo(to); // 抄送 if (cc != null && cc.length > 0) { messageHelper.setCc(cc); } // 主题 messageHelper.setSubject(template.getSubject()); // 邮件正文 String content = getFreemarkerContent(template.getContent(), params); messageHelper.setText(content, true); int status = ExecuteStatus.SUCCESS.getValue(); // 发送邮件 try { mailSender.send(mimeMessage); } catch (Exception e) { status = ExecuteStatus.FAIL.getValue(); logger.error("send error", e); } sysMailLogService.insert(templateId, config.getUsername(), to, cc, template.getSubject(), content, status); return status == ExecuteStatus.SUCCESS.getValue() ? true : false; } /** * 获取Freemarker渲染后的内容 * * @param content * 模板内容 * @param params * 参数 */ private String getFreemarkerContent(String content, Map params) throws Exception { if (MapUtil.isEmpty(params)) { return content; } // 模板 StringReader reader = new StringReader(content); Template template = new Template("mail", reader, null, "utf-8"); // 渲染模板 StringWriter sw = new StringWriter(); template.process(params, sw); content = sw.toString(); IOUtils.closeQuietly(sw); return content; } /** * 发送邮件 * * @param to * 收件人 * @param cc * 抄送 * @param subject * 主题 * @param content * 邮件正文 * @return true:成功 false:失败 */ public boolean sendMail(String[] to, String[] cc, String subject, String content) throws Exception { EmailConfig config = sysParamsService.getValueObject(MAIL_CONFIG_KEY, EmailConfig.class); JavaMailSenderImpl mailSender = createMailSender(config); MimeMessage mimeMessage = mailSender.createMimeMessage(); // 设置utf-8编码 MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8"); messageHelper.setFrom(config.getUsername()); // 收件人 messageHelper.setTo(to); // 抄送 if (cc != null && cc.length > 0) { messageHelper.setCc(cc); } // 主题 messageHelper.setSubject(subject); // 邮件正文 messageHelper.setText(content, true); int status = ExecuteStatus.SUCCESS.getValue(); // 发送邮件 try { mailSender.send(mimeMessage); } catch (Exception e) { status = ExecuteStatus.FAIL.getValue(); logger.error("send error", e); } sysMailLogService.insert(null, config.getUsername(), to, cc, subject, content, status); return status == ExecuteStatus.SUCCESS.getValue() ? true : false; } }