springboot:发送简单邮件、带附件邮件、Freemarker做模版邮件、Thymeleaf做模版邮件、定时任务


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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值