特别说明:邮件所采用的均为QQ邮件
一、邮箱准备
作为发送方,需要开启相关服务。
首先打开邮箱,然后选择设置,再选择账户
开启以下服务
我们可以在这里获取邮箱的授权码。
二、项目准备
2.1、依赖引入
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 引入mail依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
</dependencies>
2.2、邮箱属性配置
#邮箱的配置
spring:
mail:
host: smtp.qq.com #发送邮件服务器
username: 3077****02@qq.com #QQ邮箱
password: xdanv*********hc #客户端授权码
protocol: smtp #发送邮件协议
properties.mail.smtp.port: 587 #端口号465或587
default-encoding: utf-8
三、项目测试
3.1、 简易测试
@Autowired
private JavaMailSender javaMailSender;
/**
* 简单的测试
*/
@GetMapping("/send")
public void sendMail() {
long startTime = System.currentTimeMillis();
//初始化邮件对象
SimpleMailMessage mail = new SimpleMailMessage();
//主题
mail.setSubject("测试主题");
//文本
mail.setText("Hello World");
//发送人
mail.setFrom("Mianded<307****02@qq.com>");
//接受人
mail.setTo("mianded@qq.com");
javaMailSender.send(mail);
long endTime = System.currentTimeMillis();
long mill = (endTime - startTime) / 1000;
System.out.println("发送邮件耗时:" + mill + ":秒");
}
3.2、附带有文件的发送测试
/**
* 带有文件的传输
*/
@GetMapping("/sendMails")
public void sendMails() {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
try {
//组装复杂邮件
MimeMessageHelper mimeHelper = new MimeMessageHelper(mimeMessage, true);
mimeHelper.setTo("mianded@qq.com");
mimeHelper.setFrom("Mianded<307*****2@qq.com>");
//标题
mimeHelper.setSubject("文件传输测试");
//正文
mimeHelper.setText("正文测试");
//附件
File file = new File("D:\\user.sql");
mimeHelper.addAttachment("SQL", file);
} catch (MessagingException e) {
e.printStackTrace();
}
javaMailSender.send(mimeMessage);
}
3.3 定时发送
定时发送是基于Spring Task完成的
我们可以在Springboot中使用注解的方式,来实现定时发送。
特别注意:我们需要在启动类上添加以下注解
即:@EnableScheduling
@SpringBootApplication
@EnableScheduling
public class MailApplication {
public static void main(String[] args) {
SpringApplication.run(MailApplication.class, args);
}
}
我们需要使用Cron表达式
CRON表达式是一个字符串,包含五个到七个由空格分隔的字段(每种软件不一样),表示一组时间,通常作为执行某个程序的时间表。
这是一个Cron的在线工具,如果有需要可以看一下
@Slf4j
@Component
public class MailTask {
@Autowired
JavaMailSender javaMailSender;
@Scheduled(cron = "0 45 14 ? * SUN-SAT")
public void scheduled() {
long startTime = System.currentTimeMillis();
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
try {
//组装复杂邮件
MimeMessageHelper mimeHelper = new MimeMessageHelper(mimeMessage, true);
mimeHelper.setTo("mianded@qq.com");
mimeHelper.setFrom("Mianded<30*****2@qq.com>");
//标题
mimeHelper.setSubject("文件传输测试");
//正文
mimeHelper.setText("正文测试");
//附件
File file = new File("D:\\user.sql");
mimeHelper.addAttachment("SQL", file);
} catch (MessagingException e) {
e.printStackTrace();
}
javaMailSender.send(mimeMessage);
long endTime = System.currentTimeMillis();
long mill = (endTime - startTime) / 1000;
System.out.println("发送邮件耗时:" + mill + ":秒");
}
}
上面的Cron表达式: "0 45 14 ? * SUN-SAT"指的就是,从周日到周六,每天的14:45 。
这样就可以实现Java的定时发送邮件。