在正式讲解如何用Springboot发送邮件之前,先普及四个容易忽视的概念(好多教程直接忽略介绍):
1、邮件协议,简单理解下:小明给小红发了一封邮件,指的是小明登录邮箱客户端(比如通过浏览器登录QQ、163、126等),将需要发送的内容已邮件的方式发送到邮件服务器,等小红同样登录邮箱客户端后客户端去邮件服务器获取小红这个账户应该获取的邮件列表并下载到客户端,这样小红在客户端就可以查看小明发送过来的邮件,大体过程如下图,画的粗糙不要介意:
2、通俗来说我们以通过浏览器登录网址的形式或者从邮箱服务提供商官网下载的邮箱客户端登录自己的账户,这两种都叫做官方的客户端,其它方式登录,都称之为第三方,第三方登录时需要获取官方授权。一般来说比如QQ邮箱、网易邮箱等都提供授权第三方登录邮箱,登录成功后可以进行客户端相同操作,比如收发邮件、分类、删除等。各个邮件服务提供商授权方式不一,目前来说主要分为两种:官方给你生成授权码或者自己填写授权码。本教程由于才用的QQ邮箱来演示,才用的是官方提供授权码方式;
3、邮件发送应用场景极多,常见的有:用户注册或账户变动通知或激活、各种促销类型的邮件、各个企业官网的招聘人才简历投递等,特别像某某XX直聘、XX无忧等招聘网站模块的简历投递功能,本质是:你把自己的简历以文件的形式上传到XX直聘服务器上,服务器上编程发送邮件到邮件服务器,然后各企业登录邮箱拉取即可;
4、Springboot发送邮件本身也是基于Spring框架中提供的JavaMailSender接口和相关类提供邮件发送功能,优点是Springboot一直以来的优点:提供大量默认配置项,使大家从繁琐配置中解放出来,只做到轻量化配置而使用完整功能。
本文抛开应用关注技术,算作一种记录,方便自己和后来者,下面开始实战:
一、创建一个Springboot项目,项目结构和pom依赖如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.8.RELEASE</version>
</parent>
<groupId>com.dongnao</groupId>
<artifactId>springboot-mail-demo</artifactId>
<version>0.0.1</version>
<name>springboot-mail-demo</name>
<description>Demo project for Spring Boot Mail Send</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</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>
</dependencies>
</project>
二、编写application.yml里面的内容
,内容如下:
spring:
mail:
host: smtp.qq.com
default-encoding: utf-8
port: 587 #端口号465或587
protocol: smtp
# 发送者邮箱账号,非必须配置项,可以从其它地方获取
username: XXX@qq.com
# 发送者邮箱授权码,非必须配置项,但一定是发送者邮箱的授权码
password: xxxxxxxxx
# 内部接受者邮箱账号,非必须配置项,可以从其它地方获取
to: XXX@qq.com
properties:
mail:
debug:
false
smtp:
socketFactory:
class: javax.net.ssl.SSLSocketFactory
顺便说一下,上述的username(邮件发送方)、password(邮件发送方授权码)、to(邮件接收方)三个配置项都是非必须配置属性,可以从数据库或者其它方式获取,但username后面指定的内容必须和password后面的内容一致,即授权码必须是发送人的授权码。之所以这么配置的原因是上述配置取决于曾经开发的某一功能(类似于简历投递,邮件发送方和接收方都是唯一可确定的)。
重点说一下QQ邮箱中授权码的获取方式,如下图,按照操作即可:
三、编写如下测试类,执行即可,执行后接收人的邮箱中就会收到下述主题和内容的邮件,如果没有收到的话确认下垃圾箱中是否存在:
package com.dongnao;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootMailDemoApplicationTests {
@Autowired
private JavaMailSender javaMailSender;
@Value("${spring.mail.username}")
private String from;
@Value("${spring.mail.to}")
private String to;
@Test
public void contextLoads() {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(from);
message.setTo(to);
message.setSubject("主题:简单邮件");
message.setText("测试邮件内容");
javaMailSender.send(message);
}
}
四、到此为止,springboot接入邮件发送的过程已介绍完毕,其余只剩下JavaMailSender接口API的使用,可以通过该类实现诸如发送普通邮件、HTML邮件、带有图片等静态资源的邮件、带有附件的邮件等,在此就不展开了。
总结:springboot发送邮件实际上是简化spring中邮件发送配置,本质就是采用区别于邮件客户端的第三方执行邮件客户端日常操作(收发、归类、删除等),稍微需要注意的是采用的password指的是授权码,而并非邮箱登录密码,授权码获取方式因邮件服务提供商而异。
以上,完了!