SpringBoot实现定时发送邮件功能

前言

本文主要实现以下功能:

  • SpringBoot整合邮件发送,实现html格式邮件的发送功能
  • SpringBoot配置Scheduled,开启定时任务功能

一、项目环境搭建

1.1 引入邮件发送依赖

创建一个SpringBoot项目,根据SpringBoot版本(此处我的版本是2.7.7),在Maven官网搜索与SpringBoot整合邮件发送的依赖包
在这里插入图片描述
在这里插入图片描述
复制该依赖放入pom.xml文件内的<dependencies>标签中

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-mail -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
    <version>2.7.7</version>
</dependency>

1.2 配置邮箱信息

以QQ邮箱为例,登录QQ邮箱官网,在设置中开启POP3/SMTP服务,保存授权码作为发送邮件时的密码
在这里插入图片描述
application.properties配置文件添加以下配置

server.port=8888
mail.port=25
mail.host=smtp.qq.com
mail.username=你的邮箱账号
mail.password=刚刚复制的授权码
# 设置每一分钟执行一次,可在浏览器中搜索corn表达式的具体使用方法
mail.cron=0 0/1 * * * ?

二、编写后台代码

2.1 开启定时任务

在主启动类上添加注解@EnableScheduling,开启定时任务功能

package com.example.springbootdemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@EnableScheduling
@SpringBootApplication
public class SpringbootDemoApplication {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(SpringbootDemoApplication.class, args);
    }

}

2.2 定义邮件发送配置类

在主启动类同级目录下,新建config目录,并在该目录下新建MailConfig配置类,配置邮件发送类的基本信息

package com.example.springbootdemo.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.mail.javamail.JavaMailSenderImpl;

@Configuration
public class MailConfig {
    
    

    @Value("${mail.host}")
    private String host;
    @Value("${mail.username}")
    private String username;
    @Value("${mail.port}")
    private int port;
    @Value("${mail.password}")
    private String password;

    @Bean
    public JavaMailSenderImpl javaMailSender() {
    
    
        JavaMailSenderImpl sender = new JavaMailSenderImpl();
        sender.setPort(port);
        sender.setHost(host);
        sender.setUsername(username);
        sender.setPassword(password);
        return sender;
    }
}

2.3 定时任务发送邮件功能实现

在主启动类同级目录下,新建domain目录,并在该目录下新建Content实体类,后续创建该对象依次存入邮件内容中。

package com.example.springbootdemo.domain;

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class Content {
    
    
    private String name;
    private String sex;
    private String hobby;
}

在主启动类同级目录下,新建schedule目录,并在该目录下新建MailSendSchedule实体类,添加注解@Component,在该类下实现定时任务发送html格式邮件功能。

package com.example.springbootdemo.schedule;

import com.example.springbootdemo.domain.Content;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Slf4j
@Component
public class MailSendSchedule {
    
    

    @Autowired
    private JavaMailSenderImpl mailSender;

    @Scheduled(cron = "${mail.cron}")
    public void sendMail(){
    
    
        log.info("-------------->进入邮件定时发送任务");
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日HH时");
        List<Content> infoList = new ArrayList<>();
        infoList.add(new Content("小兰","女","听音乐"));
        infoList.add(new Content("小明","男","打篮球"));

        // TODO 需要自己后续配置邮件内容、收件人、抄送人等信息
        String text = getText(infoList);
        String[] receiver = {
    
    };
        String[] cc = {
    
    };

        // 发送html格式邮件
        try {
    
    
            MimeMessage mimeMessage = mailSender.createMimeMessage();
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true, "utf-8");
            mimeMessageHelper.setFrom(mailSender.getUsername());
            String currentTime = sdf.format(new Date());
            mimeMessageHelper.setSubject(currentTime+"邮件发送测试");
            if (receiver.length == 0 || cc.length == 0) {
    
    
                throw new MessagingException("收件人或抄送人为空!!!");
            }
            mimeMessageHelper.setTo(receiver);
            mimeMessageHelper.setCc(cc);
            mimeMessageHelper.setText(text, true);
            mailSender.send(mimeMessage);
            log.info("-------------->邮件发送成功");
        } catch (MessagingException e) {
    
    
            e.printStackTrace();
            log.error("-------------->邮件发送失败!!!{}",e.toString());
        } finally {
    
    
            log.info("-------------->邮件定时发送任务结束");
        }
    }

    // 获取邮件内容
    private String getText(List<Content> infoList){
    
    
        StringBuilder message = new StringBuilder();
        message.append("<table border=\"1\" cellpadding=\"1\"; cellspacing=\"1\">");
        message.append("<tr>");
        message.append("<td style='background-color:blue'>姓名</td>");
        message.append("<td style='background-color:blue'>性别</td>");
        message.append("<td style='background-color:blue'>爱好</td>");
        message.append("</tr>");
        infoList.stream().forEach((content)->{
    
    
            message.append("<tr>");
            message.append("<td>"+content.getName()+"</td>");
            message.append("<td>"+content.getSex()+"</td>");
            message.append("<td>"+content.getHobby()+"</td>");
            log.info(content.getName()+"+"+content.getSex()+"+"+content.getHobby());
            message.append("</tr>");
        });
        message.append("</table>");
        return message.toString();
    }
}

三、结果展示

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43730812/article/details/128632629
今日推荐