/** 
 | 
 * 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<String, Object> 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<String, Object> 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; 
 | 
    } 
 | 
  
 | 
} 
 |