前言
本文主要实现以下功能:
- 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();
}
}