Spring boot 集成邮件通知及线程异步发送

1. 工作中很难避免会有一些需要邮件通知的情况,网络上也有很多邮件模板和工具类

     我们可以先从网上找一个邮件工具类试着体验一下邮件发送然后在进行改造(直接使用工具类也能发送邮件,不过我们每次程序执行时还要调用邮件发送势必会影响我们编写的程序执行效率,尤其对需进行压测的程序不建议直接使用)!

       在此提供一篇供参考 邮件通知工具类       

2. 邮件通知

首先我们建一张邮件模板表用于存储邮件模板,如下图

字段意思分别是 id,code,参数个数,模板内容,使用状态值.....后面是记录创建和修改人和时间

 

其次我们将邮件模板从数据库中读取出来并写入缓存中(简单的代码在此忽略不做展示和解释)

     

      logger.info("==========加载邮件模板信息===begin========");

      List<EmailTemplate> listEmailTemplate = emailTemplateMapper.selectAll();

      //本类只有一个属性List<EmailTemplate> emailTemplates 并于使用对象的方式存储数据

      EmailTemplateDTO emailTemplateDTO = new EmailTemplateDTO();

      emailTemplateDTO.setEmailTemplates(listEmailTemplate);



      redisUtil.setObjectToJson(SystemInitUtil.SYSTEM_EMAIL_TEMPLATE, -1,emailTemplateDTO);

注意需要在程序启动时或使用时自动加载实现CommandLineRunner类即可,这个实现简单不做解释;

下面我们就需要实际项目使用了,我们为了不影响正常程序执行采用另起线程的方式发送邮件(后面会给我封装好的工具类)

   

    String assignerEmail ="";   //收件人邮箱,可多个以逗号分隔

    String content1 =systemInitUtil.getEmailTempCon("AD-002", new String[] {enterName});
    //根据code返回模板内容

    SendEmailThread sendEmailThread = new SendEmailThread(sendEmailUtil,assignerEmail,"入场反馈",content1,null);

   new Thread(sendEmailThread, "需求创建系统自动发送邮件").start();

 

 

工具类的属性值

修改后的邮件工具类

package com.leon.api.common.utils.email;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Date;
import java.util.Properties;

import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

import com.leon.api.common.utils.StringUtil;

@Configuration
public class SendEmailUtil {
    private static Logger logger = LoggerFactory.getLogger(SendEmailUtil.class);    
    @Value("${emailTitle}")
    private String emailTitle;    
    
    @Value("${emailAccount}")
    private String emailAccount;
    
    @Value("${emailPassword}")
    private String emailPassword;
    
    @Value("${emailSMTPHost}")
    private String emailSMTPHost;
    
    @Value("${templatePath}")
    private String templatePath;
    
    public static void main(String[] args) {
        SendEmailUtil util = new SendEmailUtil();
        util.sendEmail("***@163.com,***@163.com", "***审批通过,详细可登录系统查看,谢谢!");
    }

    /**
     * 邮件发送
     *
     * @param receiveMailAccount
     *            发送邮件地址
     * @param title
     *            主题
     * @param content
     *            内容
     */
    public synchronized void sendEmail(String receiveMailAccount, String content) {
        sendEmail(receiveMailAccount,emailTitle,content,null);
    }

    /**
     * 邮件发送
     *
     * @param receiveMailAccount
     *            发送邮件地址
     * @param title
     *            主题
     * @param content
     *            内容
     */
    public synchronized void sendEmail(String receiveMailAccount, String title, String content) {
        sendEmail(receiveMailAccount,title,content,null);
    }
    
    /**
     * 邮件发送
     *
     * @param receiveMailAccount
     *            发送邮件地址    
     * @param title
     *            主题
     * @param content
     *            内容
     * @param ccMailAccount
     *            抄送邮件地址
     */
    public synchronized void sendEmail(String receiveMailAccount, String title, String content,String ccMailAccount) {
        logger.info("==========邮件发送开始=========== ");
        logger.info("邮件发送地址:" + receiveMailAccount);
        logger.info("邮件内容:" + content);
        try {
            String  emailT = getEmailTempalte();
            
            content =  emailT.replace("/**content**/",content);
            
//            receiveMailAccount = "yhxiangc@isoftstone.com";
//            ccMailAccount = "yhxiangc@isoftstone.com";
            
            Properties props = new Properties(); // 参数配置
            props.setProperty("mail.transport.protocol", "smtp"); // 使用的协议(JavaMail规范要求)
            props.setProperty("mail.smtp.host", emailSMTPHost); // 发件人的邮箱的 SMTP 服务器地址
            props.setProperty("mail.smtp.auth", "true");

            Session session = Session.getInstance(props);
            session.setDebug(true);                
            MimeMessage message = sendMimeMessage(session, receiveMailAccount,ccMailAccount,title,content);

            Transport transport = session.getTransport();
            transport.connect(emailAccount, emailPassword);
            transport.sendMessage(message, message.getAllRecipients());
            transport.close();        
        } catch (Exception e) {
            e.printStackTrace();
        }
        logger.info("==========邮件发送完成=========== ");
    }

    /**
     * 创建一封只包含文本的简单邮件
     *
     * @param session
     *            和服务器交互的会话
     * @param replyToMail
     *            抄送邮箱
     * @param receiveMail
     *            收件人邮箱
     * @return
     * @throws Exception
     */    
    private static MimeMessage sendMimeMessage(Session session, String receiveMail,String replyToMail, String title, String content)
            throws Exception {
        // 1. 创建一封邮件
        MimeMessage message = new MimeMessage(session);
        Multipart multipart = new MimeMultipart();
        
        // 2. From: 发件人(昵称有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改昵称)
        message.setFrom(new InternetAddress("******@163.com", "系统公共邮箱", "UTF-8"));

        // 3. To: 收件人(可以增加多个收件人、抄送、密送)
        if (receiveMail.indexOf(",") < 0) {
            message.setRecipient(MimeMessage.RecipientType.TO,new InternetAddress(receiveMail, receiveMail.split("@")[0], "UTF-8"));
        } else {
            String[] receiveMails = receiveMail.split(",");
            Address[] addresses = new Address[receiveMails.length];
            String mail = "";
            for (int i = 0; i < receiveMails.length; i++) {
                mail = receiveMails[i];
                addresses[i] = new InternetAddress(mail, mail.split("@")[0], "UTF-8");
            }
            message.setRecipients(MimeMessage.RecipientType.TO, addresses);                
        }
        
        //抄送
        if(StringUtil.isNotNull(replyToMail) && replyToMail.indexOf(",") < 0) {
            message.setRecipient(MimeMessage.RecipientType.CC,new InternetAddress(replyToMail, replyToMail.split("@")[0], "UTF-8"));
        } else if(StringUtil.isNotNull(replyToMail) && replyToMail.indexOf(",") > 0) {
            String[] replyToMails = replyToMail.split(",");
            Address[] addresses = new Address[replyToMails.length];
            String ccAddresses = "";
            for(int i = 0; i < replyToMails.length; i++) {
                ccAddresses = replyToMails[i];
                addresses[i] = new InternetAddre
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值