1 邮件基础知识
1.SMTP邮件协议
SMTP 是一个基于 TCP/IP 的应用层协议,江湖地位有点类似于 HTTP,SMTP 服务器默认监听的端口号为 25 。SMTP 协议全称为 Simple Mail Transfer Protocol,译作简单邮件传输协议,它定义了邮件客户端软件于 SMTP 服务器之间,以及 SMTP 服务器与 SMTP 服务器之间的通信规则。
假设从 aaa@qq.com 发送邮件到 111@163.com :
①aaa@qq.com 先将邮件投递到腾讯的邮件服务器
②腾讯的邮件服务器将我们的邮件投递到网易的邮件服务器
③111@163.com 登录网易的邮件服务器查看邮件
①和 ②就用到了SMTP
2.POP3邮件协议
而 POP3 协议全称为 Post Office Protocol ,译作邮局协议,它定义了邮件客户端与 POP3 服务器之间的通信规则,那么该协议在什么场景下会用到呢?当邮件到达网易的 SMTP 服务器之后, 111@163.com 用户需要登录服务器查看邮件,这个时候就该协议就用上了:邮件服务商都会为每一个用户提供专门的邮件存储空间,SMTP 服务器收到邮件之后,就将邮件保存到相应用户的邮件存储空间中,如果用户要读取邮件,就需要通过邮件服务商的 POP3 邮件服务器来完成。
3.IMAP邮件协议
这个协议是对 POP3 协议的扩展,功能更强,作用类似。
2发送 QQ 邮件
1.准备工作
开启POP3/SMTP服务
发送短信后记住授权码授权码
2.发送简单邮件
1.创建springboot工程
选择web和mail
2.application.yml邮件配置
# 把邮件投递到腾讯的SMTP邮件服务器上
spring:
mail:
host: smtp.qq.com
port: 587
username: QQ邮箱名称
password: 授权码
default-encoding: utf-8
# 加密连接的工具类
properties:
mail:
smtp:
SocketFactory:
class: javax.net.SocketFactory
# 可在控制台看到邮件发送的过程
debug: true
3.发送简单邮件
package com.ll;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import java.util.Date;
@SpringBootTest
class MailApplicationTests {
@Autowired
JavaMailSender javaMailSender;
@Test
void contextLoads() {
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
simpleMailMessage.setFrom("发送人邮箱号");
simpleMailMessage.setTo("接收人邮箱号");
simpleMailMessage.setSentDate(new Date());
simpleMailMessage.setSubject("邮件主题");
simpleMailMessage.setText("邮件内容");
javaMailSender.send(simpleMailMessage);
}
}
3.发送带附件的邮件
@Test
void test1() throws MessagingException {
File file = new File("C:/Users/user1/Desktop/工作簿.xlsx");
MimeMessage message = javaMailSender.createMimeMessage();
// multipart=true是复合邮件
MimeMessageHelper messageHelper = new MimeMessageHelper(message, true);
simpleMailMessage.setFrom("发送人邮箱号");
simpleMailMessage.setTo("接收人邮箱号");
messageHelper.setSentDate(new Date());
messageHelper.setSubject("邮件主题test2");
messageHelper.setText("邮件测试test2!!!");
messageHelper.addAttachment(file.getName(),file);
javaMailSender.send(message);
}
4.使用 Freemarker 做邮件模版
1.添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
2.添加邮件模板
<div>欢迎 ${username} 加入 ${company}大家庭,您的入职信息如下:</div>
<table>
<tr>
<td>姓名</td>
<td>${username}</td>
</tr>
<tr>
<td>职位</td>
<td>${position}</td>
</tr>
<tr>
<td>薪水</td>
<td>${sal}</td>
</tr>
</table>
3.发送邮件
@Test
void test2() throws MessagingException, IOException, TemplateException {
MimeMessage message = javaMailSender.createMimeMessage();
// multipart=true是复合邮件
MimeMessageHelper messageHelper = new MimeMessageHelper(message, true);
simpleMailMessage.setFrom("发送人邮箱号");
simpleMailMessage.setTo("接收人邮箱号");
messageHelper.setSentDate(new Date());
messageHelper.setSubject("邮件主题test2");
Configuration configuration = new Configuration(Configuration.VERSION_2_3_31);
configuration.setClassLoaderForTemplateLoading(MailApplication.class.getClassLoader(),"mail");
Template template = configuration.getTemplate("mail.ftl");
User user=new User();
user.setPosition("java工程师");
user.setSal(999);
user.setUsername("张三");
user.setCompany("阿里巴巴");
StringWriter out = new StringWriter();
template.process(user,out);
messageHelper.setText(out.toString(),true);
javaMailSender.send(message);
}
5.使用 Thymeleaf 做邮件模版
1.添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
2.添加邮件模板
<!DOCTYPE html>
<html lang="en" xml:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>欢迎 <span th:text="${username}"></span> 加入 <span th:text="${company}"></span>大家庭,您的入职信息如下:</div>
<table>
<tr>
<td>姓名</td>
<td th:text="${username}"></td>
</tr>
<tr>
<td>职位</td>
<td th:text="${position}"></td>
</tr>
<tr>
<td>薪水</td>
<td th:text="${sal}"></td>
</tr>
</table>
</body>
</html>
3.发送邮件
@Autowired
TemplateEngine templateEngine;
void test3() throws MessagingException {
MimeMessage message = javaMailSender.createMimeMessage();
// multipart=true是复合邮件
MimeMessageHelper messageHelper = new MimeMessageHelper(message, true);
messageHelper.setFrom("2237041494@qq.com");
messageHelper.setTo("469097129@qq.com");
messageHelper.setSentDate(new Date());
messageHelper.setSubject("邮件主题test2");
User user=new User();
user.setPosition("java工程师");
user.setSal(999);
user.setUsername("张三");
user.setCompany("阿里巴巴");
Context ctx=new Context();
ctx.setVariable("username","张三");
ctx.setVariable("position","java工程师");
ctx.setVariable("sal","999");
ctx.setVariable("company","阿里巴巴");
String text = templateEngine.process("mail.html", ctx);// ctx上下文
messageHelper.setText(text,true);
javaMailSender.send(message);
}
3 定时任务
1.通过 @Scheduled 注解配置定时任务
1.创建springboot项目
只需要引入web依赖
2.开启定时任务
@SpringBootApplication
@EnableScheduling
public class ScheduledApplication {
public static void main(String[] args) {
SpringApplication.run(ScheduledApplication.class, args);
}
}
3.配置定时任务
package com.ll;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class MyScheduled {
// 该定时任务执行结束1s之后下个任务开启
@Scheduled(fixedDelay = 1000)
public void fixedDelay(){
System.out.println("fixedDelay"+new Date());
}
// 该定时任务开始执行1秒之后下个任务开启
@Scheduled(fixedRate = 1000)
public void fixedRate(){
System.out.println("fixedRate"+new Date());
}
// 首次执行的延迟时间,该定时任务会延迟1s启动
@Scheduled(initialDelay = 1000,fixedRate = 100)
public void initialDelay() {
System.out.println("initialDelay"+new Date());
}
// cron表达式,自定义规则
// 每隔5s执行一次
@Scheduled(cron = "0/5 * * * * *")
public void cron(){
System.out.println("cron"+new Date());
}
}
2.通过 @Quartz 注解配置定时任务
1.创建springboot项目
选择web和Quartz依赖
2.job具体执行的任务
job创建的两种方式
1、@Component定义成spring的一个组件
@Component
public class MyJob1 {
public void hell01(){
System.out.println("job01 "+new Date());
}
}
2、继承自QuartzJobBean
package com.ll.job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
import java.util.Date;
public class MyJob2 extends QuartzJobBean {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
// 写定时任务
System.out.println("Job2 "+name+" : "+new Date());
}
}
3.触发器什么时候执行任务
触发器创建的两种方式
MethodInvokingJobDetailFactoryBean和JobDetailFactoryBean
package com.ll.trigger;
import com.ll.job.MyJob2;
import org.quartz.JobDataMap;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.JobDetailFactoryBean;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
@Configuration
public class QuartzConfig {
@Bean
MethodInvokingJobDetailFactoryBean jobDetail1(){
MethodInvokingJobDetailFactoryBean bean = new MethodInvokingJobDetailFactoryBean();
// 注入的job bean的名称,类名首字母小写
bean.setTargetBeanName("myJob1");
// 目标方法名称,myJob1是普通的Javabean,注入到spring容器中,不知道要执行哪个方法
bean.setTargetMethod("hell01");
return bean;
}
@Bean
JobDetailFactoryBean jobDetailFactoryBean(){
JobDetailFactoryBean bean = new JobDetailFactoryBean();
bean.setJobClass(MyJob2.class);
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put("name","lili");
bean.setJobDataMap(jobDataMap);
return bean;
}
}
4.把任务和触发器结合在一起
有很多种方法,SimpleTriggerFactoryBean和CronTriggerFactoryBean是其中的两个
@Bean
SimpleTriggerFactoryBean simpleTriggerFactoryBean(){
SimpleTriggerFactoryBean bean = new SimpleTriggerFactoryBean();
// 触发器对应的任务
bean.setJobDetail(jobDetail1().getObject());
// 重复的次数
bean.setRepeatCount(3);
// 重复的延迟时间
bean.setStartDelay(3000);
// 重复的间隔时间
bean.setRepeatInterval(1000);
return bean;
}
@Bean
CronTriggerFactoryBean cronTriggerFactoryBean(){
CronTriggerFactoryBean bean = new CronTriggerFactoryBean();
bean.setJobDetail(jobDetail2().getObject());
bean.setCronExpression("0/5 * * * * ?");
return bean;
}
5.设置触发器至启动器SchedulerFactoryBean
@Bean
SchedulerFactoryBean schedulerFactoryBean(){
SchedulerFactoryBean bean = new SchedulerFactoryBean();
bean.setTriggers(simpleTriggerFactoryBean().getObject(),cronTriggerFactoryBean().getObject());
return bean;
}