读取excel,使用异步发送邮件

1.如何发送邮件

1.加入poml依赖

     
        
            org.springframework.boot
            spring-boot-starter-mail
        

2.配置发送邮件的配置

spring:
  mail:
    # 配置 SMTP 服务器地址
    host: smtp.126.com
    # 发送者邮箱
    username: [email protected]
    # 配置密码,注意不是真正的密码,而是刚刚申请到的授权码
    password: FSHJMBSLFDNOBJFL
    # 端口号465或587 ,可不写
    # port: 587 
    # 默认的邮件编码为UTF-8
    default-encoding: UTF-8
    # 配置SSL 加密工厂
    properties:
      mail:
        smtp:
          socketFactoryClass: javax.net.ssl.SSLSocketFactory
        #表示开启 DEBUG 模式,这样,邮件发送过程的日志会在控制台打印出来,方便排查错误
        debug: true

126邮箱SMTP服务器地址:smtp.126.com,端口号:465或者994
2163邮箱SMTP服务器地址:smtp.163.com,端口号:465或者994
yeah邮箱SMTP服务器地址:smtp.yeah.net,端口号:465或者994
qq邮箱SMTP服务器地址:smtp.qq.com,端口号465或587*

3.发送普通邮件

	@Autowired
    JavaMailSender javaMailSender;   
		/**
     * 普通邮件发送
     */
    @Test
    public void sendSimpleMail() {
        // 构建一个邮件对象
        SimpleMailMessage message = new SimpleMailMessage();
        // 设置邮件主题
        message.setSubject("这是一封测试邮件");
        // 设置邮件发送者,这个跟application.yml中设置的要一致
        message.setFrom("[email protected]");
        // 设置邮件接收者,可以有多个接收者,中间用逗号隔开,以下类似
      	// message.setTo("10*****[email protected]","12****32*qq.com");
        message.setTo("[email protected]");
        // 设置邮件抄送人,可以有多个抄送人
        // message.setCc("12****32*qq.com");
        // 设置隐秘抄送人,可以有多个
        // message.setBcc("7******[email protected]");
        // 设置邮件发送日期
        message.setSentDate(new Date());
        // 设置邮件的正文
        message.setText("这是测试邮件的正文");
        // 发送邮件
        javaMailSender.send(message);
    }

4.发送带附件的邮箱

 public void sendAttachFileMail() throws MessagingException {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
      	// true表示构建一个可以带附件的邮件对象
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true);

        helper.setSubject("这是一封测试邮件");
        helper.setFrom("79******[email protected]");
        helper.setTo("10*****[email protected]");
        //helper.setCc("[email protected]");
        //helper.setBcc("[email protected]");
        helper.setSentDate(new Date());
        helper.setText("这是测试邮件的正文");
        // 第一个参数是自定义的名称,后缀需要加上,第二个参数是文件的位置
        helper.addAttachment("资料.xlsx",new File("/Users/gamedev/Desktop/测试数据 2.xlsx"));
        javaMailSender.send(mimeMessage);
    }


5,使用模板发送邮件

1.Thymeleaf 作邮件模板,加入依赖

    
  org.springframework.boot    
  spring-boot-starter-thymeleaf 
 

2.创建Thymeleaf模板:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<p>hello 欢迎加入 xxx 大家庭,您的入职信息如下:</p>
<table border="1">
    <tr>
        <td>姓名</td>
        <td th:text="${username}"></td>
    </tr>
    <tr>
        <td>工号</td>
        <td th:text="${num}"></td>
    </tr>
    <tr>
        <td>薪水</td>
        <td th:text="${salary}"></td>
    </tr>
</table>
<div style="color: #ff1a0e">一起努力创造辉煌</div>
</body>
</html>

3.发送邮件:

 @Autowired
    TemplateEngine templateEngine;

    @Test
    public void sendThymeleafMail() throws MessagingException {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
        helper.setSubject("这是一封测试邮件");
        helper.setFrom("[email protected]");
        helper.setTo("[email protected]");
//        helper.setCc("[email protected]");
//        helper.setBcc("[email protected]");
        helper.setSentDate(new Date());
      	// 这里引入的是Template的Context
        Context context = new Context();
      	// 设置模板中的变量
        context.setVariable("username", "javaboy");
        context.setVariable("num","000001");
        context.setVariable("salary", "99999");
      	// 第一个参数为模板的名称
        String process = templateEngine.process("hello.html", context);
      	// 第二个参数true表示这是一个html文本
        helper.setText(process,true);
        javaMailSender.send(mimeMessage);
    }

2.如何读取excel

1.加入阿里巴巴easyexcel依赖


        
            com.alibaba
            easyexcel
            2.1.6
        

2.创建excel监听类

@Slf4j
@Service
public class ReadExcelListener extends AnalysisEventListener<StudentInfo> {


    //  用来存放读取的数据
    private static List<StudentInfo> studentInfoList = new ArrayList<>();


    @Override
    public void invoke(StudentInfo studentInfo, AnalysisContext analysisContext) {
        // 解析excel
        log.info("------解析到一条数据:{} ------",studentInfo);
        studentInfoList.add(studentInfo);
    }
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        // 解析完excel自动执行该方法
        log.info("------ 读取完毕,开始处理数据 ------");
    }

    public List<StudentInfo> showStudentInfo(){
        // 可以通过这个来调用解析的数据
        log.info("------ 调用数据");
        return studentInfoList;
    }

}

3.通过controller调用

 // 调用读取excel监听器
    @Autowired
    private ReadExcelListener readExcelListener;

// 读取并发送邮件
  @GetMapping("readExcel")
  public String readExcelAndAsyncSendMail(@RequestParam String mail) throws Exception {

        log.info("------- 开始读取excel ------");
        // 创建一个邮件对象
        MailInfo mailInfo = new MailInfo();
        mailInfo.setGetPeople(mail);
        mailInfo.setTitle("KH88-XXX-异步解析excel成功");

        // 解析excel内容
        InputStream  fis = new FileInputStream("D:\\java\\学生信息.xls");
        EasyExcel.read(fis, StudentInfo.class, readExcelListener).sheet().doRead();

        // 读入解析内容
        List<StudentInfo> studentInfos = readExcelListener.showStudentInfo();
        // 存入邮箱实体
        mailInfo.setDetail(studentInfos.toString());
        // 异步发送信息
        sendMailService.sendMailToTeacher(mailInfo);

        log.info("-------结束读取excel ------");

        return  "发送成功";
    }   
    
    
 

3.生成excel

1.前面和导出一样

2.写一个静态的资源,以便读取

public class StudentInfoUtil {

    public static List<StudentInfo> employees = new ArrayList<>();

    static {
        employees.add(new StudentInfo(35,"kh88","张三",18,"男","剑四顾海事","2012-04-05","13776571041"));
        employees.add(new StudentInfo(36,"kh88","李四",20,"女","剑四顾海事","2012-04-05","13776571041"));
        employees.add(new StudentInfo(37,"kh88","王五",21,"男","剑四顾海事","2012-04-05","13776571041"));
    }
}


3.controller直接写导出

 /**
    *@ClassName: ReadStudentInfoController
    *@Description 读取数据并生成excel
    *@Author lzy
    *@Date 2021/5/27
    */
    @GetMapping("writeExcel")
    public String writeExcelAndAsyncSendMail(HttpServletResponse response) throws Exception {
        // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
        // 设置返回的格式
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileName = URLEncoder.encode("测试", "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");

        EasyExcel.write(response.getOutputStream(), StudentInfo.class).sheet("学生信息").doWrite(StudentInfoUtil.employees);

        return "写入成功";
    }


你可能感兴趣的:(java,spring,boot)