0
点赞
收藏
分享

微信扫一扫

JAVA Spring Boot实现发邮件功能 可灵活配置消息模板 附代码

暮晨夜雪 2021-09-21 阅读 52

1、添加pom.xml依赖文件

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

2、创建工具类

package com.superkind.common.util.email;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;

/**
 * 邮件工具类
 * @author yokips
 * @date 2019/12/6 10:41
 */
@Component
public class EmailUtil {

    @Autowired
    private JavaMailSender javaMailSender;

    @Value("${spring.mail.fromMail.addr}")
    private String from;

    /**
     * html邮件
     * @param to 接收人
     * @param subject 主题
     * @param content 邮件内容
     * @return
     */
    public Boolean sendHtmlMail(String to, String subject, String content) {
        MimeMessage message = javaMailSender.createMimeMessage();
        try {
            // true表示需要创建一个multipart message
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(from);
            helper.setTo(to); //接收者的邮箱
            helper.setSubject(subject);//标题
            helper.setText(content, true);//内容
            javaMailSender.send(message);
            return true;
        } catch (MessagingException e) {
            return false;
        }
    }
}


3、在application.xml中写邮件相关配置

mail:
    default-encoding: UTF-8
    host: smtp.exmail.qq.com
    username: xxxxx@sina.com                    
    password: xxxxxxxxxx
    fromMail:
      addr: 冲冲冲<xxxx@sina.com> #发件人 需要跟mail的username相同
    port: 465
    properties:
      mail:
        smtp:
          auth: true    #设置是否需要认证
          starttls:     #将纯文本连接升级为加密连接(TLS或SSL)而不是另外使用一个端口作加密通信
            enable: true
            required: true
          socketFactory:
            class: javax.net.ssl.SSLSocketFactory

实际上这个工具类就已经可以实现发送邮件的功能了,但为了更灵活的对各种消息进行发送,可以使用消息模板来对内容进行控制

1、建立消息模板表

CREATE TABLE `cy_message_sys_message_teplate` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `msgtemplate_key` varchar(50) NOT NULL COMMENT '消息Key,代码中需要对应',
  `msgtemplate_name` varchar(50) NOT NULL COMMENT '描述',
  `msgtemplate_context` varchar(255) NOT NULL DEFAULT '0' COMMENT '消息模板内容',
  `del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '数据是否删除 0正常1删除,默认0',
  `edit_flag` char(1) NOT NULL DEFAULT '0' COMMENT '0可编辑1不可编辑',
  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `url` varchar(255) DEFAULT NULL COMMENT '前端页面跳转',
  `type` char(255) DEFAULT '0' COMMENT '类型 1 指定人员',
  `user_id` int(11) DEFAULT NULL COMMENT '指定人员ID',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=73 DEFAULT CHARSET=utf8 COMMENT='消息模板表';



添加一条测试数据


service层调用代码


import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.*;

/**
 * <p>
 * 邮件发送相关代码
 * </p>
 *
 * @author yokip
 * @since 2019-12-10
 */
@Service
public class SysEnquiryServiceImpl extends ServiceImpl<SysEnquiryMapper, SysEnquiry> implements ISysEnquiryService {


    @Autowired
    private SysEnquiryInfoMapper infoMapper;

    @Autowired
    EmailUtil emailUtil;
    
    public void test(){
        //查找消息模板信息
        MessageTemlateInfoVO temlateInfo = infoMapper.getMessageTemplateInfo("TEST");
        if(temlateInfo==null){
            throw new RuntimeException("未找到消息模板");
        }

        //消息模板参数  将消息模板中的#{0} #{1} 替换成需要的字符
        HashMap params = new HashMap();
        params.put("0","测试测试");
        params.put("1","测试测试");

        //发送邮件
        emailUtil.sendHtmlMail("xxxxx@outlook.com",temlateInfo.getMsgtemplateName(),replaceString(temlateInfo.getMsgtemplateContext(),params));


        //如果是群发则循环发送
        List<String> emailList = new ArrayList<>();
        emailList.add("xxxxx@sina.com");
        emailList.add("xxxxx@outlook.com");
        emailList.add("xxxxx@qq.com");

        //循环发送邮件
        emailList.forEach(email->{
            emailUtil.sendHtmlMail("kimoji981002@outlook.com",temlateInfo.getMsgtemplateName(),replaceString(temlateInfo.getMsgtemplateContext(),params));

        });


    }


    //将消息模板中的#{0} #{1} 替换成需要的字符
    private String replaceString(String context, Map map) {
        for (int i = 0; i < map.size(); i++) {
            Object replaceValue = map.get("" + i + "");
            context = context.replace("#{" + (i) + "}", replaceValue.toString());
        }
        return context;
    }
}




举报

相关推荐

0 条评论