功能实现需要两个知识点:1 定时任务 2 邮件服务
先说SringBoot定时任务:
SpringBoot自带定时任务处理,开箱即用 方便快捷以及灵活配置等特点。实现需要两个注解,@EnableScheduling //表示开启定时任务注解支持
@Scheduled //自带cron表达式,方便用户自定义。
示例如下:
/**
* @ClassName ApplicationTest
* @Description TODO
* @Author 86150
* @Date 2021/1/20 21:08
* @Version 1.0
**/
@SpringBootApplication
@EnableAsync//开启异步支持
@EnableScheduling//开启定时任务执行
public class ApplicationTest {
public static void main(String[] args) {
SpringApplication.run(ApplicationTest.class);
}
}
cron表达式 用户可自行百度,
//秒 分 时 日 月 周
//每天每时每分 每两秒执行一次
@Scheduled(cron = "0/2 * * * * ?")
public void test2(){
System.out.println("每两秒执行"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
}
邮件服务:
1 在使用邮件服务之间务必 要开通POP3/SMTP 服务,否则你的服务无法与之通信。
2 需要导入指定jar
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
3 配置邮件:
# 配置使用的哪个邮件服务商
spring.mail.host=smtp.163.com
# 发送人的邮箱
spring.mail.username=1506405245@163.com
# 授权码 表示可以通信 (服务能让你在本地客户端上收发邮件)
spring.mail.password=FFLDJIDFDssgMIEDLZ
#####################FFLDJIDFDMIEDLZ
个人不建议使用QQ邮箱,作者自己测试的时候,QQ的授权码老是失效,动不动就报错,目前也没有找到QQ授权码永久开启的方法。
3 邮件可以分为普通的邮件和复杂一些的邮件,不过原理都是相通的。
在这里我们主要使用一个类JavaMailSenderImpl
他实现了JavaMailSender接口,而JavaMailSender接口自己又继承了MailSender接口。MailSender中只有两个发送核心方法,如图所示:
//
package org.springframework.mail;
public interface MailSender {
void send(SimpleMailMessage var1) throws MailException;
void send(SimpleMailMessage... var1) throws MailException;
}
3.1 普通邮件服务
3.1.1 创建邮件主题
3.1.2 创建邮件文本
3.1.3 指定发送人
3.1.4 指定接收人
3.1.5 调用发送方法
@Autowired
private JavaMailSender javaMailSender;
public void sendMail() {
long startTime = System.currentTimeMillis();
//初始化邮件对象
SimpleMailMessage mail = new SimpleMailMessage();
//主题
mail.setSubject("测试主题");
//文本
mail.setText("Hello World");
//发送人
mail.setFrom("15064023564@163.com");
//接受人
mail.setTo("229023541@qq.com");
javaMailSender.send(mail);
long endTime = System.currentTimeMillis();
long mill = (endTime - startTime) / 1000;
System.out.println("发送邮件耗时:" + mill + ":秒");
}
3.2 复杂邮件服务,无非是添加了附件 如图片、pdf、txt等
public void sendMessage() {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
try {
//组装复杂邮件
MimeMessageHelper mimeHelper = new MimeMessageHelper(mimeMessage, true);
mimeHelper.setTo("2290243831@qq.com");
mimeHelper.setFrom("15064025083@163.com");
//标题
mimeHelper.setSubject("开发者测试");
//正文
mimeHelper.setText("抗击疫情 人人有责");
//附件
File file = new File("D:\\devTools\\apache-maven-3.6.1-bin.zip");
mimeHelper.addAttachment("清明上河图", file);
//图片
mimeHelper.addAttachment("test.png", new File("D:\\wp\\思维导图\\servlet原理.png"));
} catch (MessagingException e) {
e.printStackTrace();
}
javaMailSender.send(mimeMessage);
}
到了这儿,实现定时任务邮件发送其实就简单了很多,无非就是将两个服务整合在一块。
1 启动类添加@EnableScheduling//开启定时任务执行
2 编写邮件发送方法,方法上面添加定时任务注解
// 秒 分 时 日 月 周
@Scheduled(cron = “0/5 * * * * ?”)
3 最后附上测试代码
// 秒 分 时 日 月 周
@Scheduled(cron = "0/5 * * * * ?")
public void send() {
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
simpleMailMessage.setFrom("150625351@163.com");
simpleMailMessage.setTo("31852651@qq.com");
simpleMailMessage.setSubject("开发者测试");
simpleMailMessage.setText("抗击疫情 人人有责 我在:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
System.out.println("开始发送 邮件:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
javaMailSender.send(simpleMailMessage);
System.out.println("邮件发送结束:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
}
2021-01-30 14:53:49.756 INFO 16332 --- [ main] com.ApplicationTest : Started ApplicationTest in 1.967 seconds (JVM running for 2.863)
开始发送 邮件:2021-01-30 14:53:50
邮件发送结束:2021-01-30 14:54:08
开始发送 邮件:2021-01-30 14:54:10
邮件发送结束:2021-01-30 14:54:28
开始发送 邮件:2021-01-30 14:54:30
Disconnected from the target VM, address: '127.0.0.1:11038', transport: 'socket'