1.创建SpringBoot项目
引入依赖:
<!--新增对邮件支持,使用javax.mail-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<!--邮件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2.配置
spring:
mail:
username: 2944397754@qq.com
password: xqqtyadfkcptddhd
default-encoding: UTF-8
host: smtp.qq.com
properties:
mail:
smtp:
auth: true
port: 587
starttls:
enable: true
required: true
说明:
首先我了解了一下SMTP协议:
SMTP是一种提供可靠且有效的电子邮件传输的协议。SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于系统之间的邮件信息传递,并提供有关来信的通知。SMTP独立于特定的传输子系统,且只需要可靠有序的数据流信道支持,SMTP的重要特性之一是其能跨越网络传输邮件,即“SMTP邮件中继”。使用SMTP,可实现相同网络处理进程之间的邮件传输,也可通过中继器或网关实现某处理进程与其他网络之间的邮件传输
SMTP服务器是遵循SMTP协议的发送邮件服务器,用来发送或中转用户发出的电子邮件
它的工作流程如下:
-
建立连接:
smtp用户与smtp服务器25号端口建立连接(该端口对应smtp服务)
-
传送邮件
SMTP客户将邮件的源地址、目的地址和邮件的具体内容传递给SMTP服务器,SMTP服务器进行相应的响应并接收邮件。
-
释放连接
STARTTLS:
是一种明文通信协议的扩展,能够让明文的通信连线直接成为加密连线(使用SSL或TLS加密),而不需要使用另一个特别的端口来进行加密通信,属于机会性加密。
如何获取授权码?
首页点击设置
点击账户,往下滑
3.写代码发邮件
-
发送简单邮件
-
发送富文本邮件
发送含图片的邮件:
//创建邮件
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
//需要使用MimeMessageHelper类对mimeMessage操作,并开启文件传输
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage,true);
//发送方
mimeMessageHelper.setFrom("xiangpei.code@qq.com");
//接收方
mimeMessageHelper.setTo("xiangpei.code@qq.com");
//主题
mimeMessageHelper.setSubject("富文本邮件图片测试");
//内容,这里是发送html的内容,需要开启为true,添加图片
mimeMessageHelper.setText("<font color='red'>Hello World!</font><img src='cid:test'>",true);
//图片路径
File file = new File("C:\\Users\\29443\\Desktop\\qq.jpg");
//添加内嵌图片
mimeMessageHelper.addInline("test",file);
//发送文件
javaMailSender.send(mimeMessage);
发送带附件的,简单了只需要在上面的代码中加一句代码
4.邮件的异步、定时任务
我们知道,发送一封邮件是需要一定时间的,大概需要等5秒?10秒?
在正真的业务开发中,用户发了一个请求,需要发送邮件,我们不肯
可能说等到邮件发送成功才响应给用户,你愿意点击一个按钮10秒才给你响应吗?
添加异步,我们就能够立即响应,而邮件的发送就让它执行去吧
如何使用异步
- 入口类加上@EnableAsync
- 需要异步的方法上添加@Async(我们这里是发邮件,就加在发邮件的方法上)
就ok了
邮件定时任务
@EnableScheduling //启动类加
@Scheduled(cron = " 0 0 20 * * ?") //方法上加
在需要的方法上加上就行了,这里是每天晚上8点执行
这里我们需要了解 corn 表达式,我也不会https://www.bejson.com/othertools/cron/,这是模拟corn的,可以计算最近10次发生的时间,也可以生成corn,非常好用建议收藏
首先它是由 6或者7个域组成,多一个是年份,因为不常用年来设置定时任务,所以可以不写年
顺序为:
秒----分-----时-----日-----月-----星期-----年
0:意思时,舍弃你这个域,我判断是否执行时不会看你(日、月、星期、年都不能设置0)
:代表任意,比如 * 10 * * * ?,(不写年也代表任意年)就是任意的年的任意月份的某天不管星期几的随意小时的第10分钟的任意一秒都会执行这个任务,?号与的区别就是,?只能在日和星期上使用
下面是比较官方的解释:https://www.bejson.com/othertools/cronvalidate/
修改:
2022.4.21:
cron的在线网址,发现标签地址写反了,哈哈。导致跳不过去,已修改。
?只能作用于日、星期,因为第几天和星期几是互相影响的。例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法: 13 13 15 20*
?, 其中最后一位只能用?,而不能使用*
,如果使用*
表示不管星期几都会触发,实际上并不是这样