携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情
在开发的时候经常会有给用户发送短信验证码的功能,下面的文章就是介绍如何在项目中如何给用户发送验证码。
发送邮件
分三步:
- 邮箱设置
- Spring Email
- 模板引擎
1. 邮件设置
- 邮箱的设置
首先我们进入第一个环节:邮箱的设置
这里我们使用qq邮箱(其他的邮箱也是一样的)
开启 POP3/SMTP 服务去发送邮件
2. Spring Email如何使用
- 怎么去使用 Spring Email
接下来是第二步,怎么去使用 Spring Email
- 引入 spring mail 依赖
首先需要引入 spring mail 依赖,可以去maven中心仓库搜索
之后将依赖粘贴到项目的 pom.xml 配置文件中
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
<version>2.7.1</version>
</dependency>
- 邮箱参数配置
要用这个邮箱,肯定得把邮箱的账号、密码、链接、协议等都配好。如果将来想换一个邮箱,只要改配置文件就好了,不要把邮箱的参数写死在 java 程序里。
进行邮箱的配置是在 application.properties 配置文件中配置的。
# MailProperties
# 声明访问邮箱的域名是什么(下一行中后面的是 qq 浏览器的smtp服务器的域名)
spring.mail.host=smtp.qq.com
# 配置端口(几乎所有的邮箱默认的端口都是465)
spring.mail.port=465
# 配置用户名和授权码
spring.mail.username=958691367@qq.com
spring.mail.password=lpfejerqpiqxbeda
# 配置协议(启用安全加密的的smtp协议)
spring.mail.protocol=smtps
# 发送邮件的时候采用 ssl 安全连接方式
spring.mail.properties.mail.smtp.ssl.enable=true
- 使用 JavaMailSender 接口 发送邮件
为了是发送邮件这个功能可以复用,我们写一个工具把整个的流程封装一下。
这个类它要把发邮件的事委托给 qq 去做,它相当于代替了 qq 邮箱的客户端,或者说它就是一个客户端。
MailClient类(工具类):
@Component
public class MailClient {
// 记录一些日志
private Logger logger = LoggerFactory.getLogger(MailClient.class);
// 发送邮件的核心组件,交给 Sping 容器去管理
@Autowired
private JavaMailSender mailSender;
// 发邮箱的时候需要几个条件:1. 发件人 2. 收件人 3. 邮件的标题和内容
// 我们在配置文件里配置了邮箱,所以发件人是固定的,就是配置文件里配置的发件人
//我们把配置文件的spring.mail.username注入到这里,省的在方法里再传了
@Value("${spring.mail.username}")
private String from;
// 发送邮件方法(记住:是public 修饰)
// 参数1:收件人 参数2:邮件标题 参数3:邮件内容
public void sendMail(String to, String subject, String content){
try {
// 创建邮件主体,但是这个message是空的,只是一个模板,我们还需要往里面填入内容。
MimeMessage message = mailSender.createMimeMessage();
// 使用帮助类构建 message 里面的内容,设置发件人、收件人、邮件标题、邮件内容
MimeMessageHelper helper = new MimeMessageHelper(message);
helper.setFrom(from); // 设置邮件发件人
helper.setTo(to); // 设置邮件收件人
helper.setSubject(subject); // 设置邮件主题
helper.setText(content, true); // 设置邮件内容(加true表示也支持html文本,不加这个参数表示支持普通的文本)
// 发送
mailSender.send(helper.getMimeMessage());
} catch (MessagingException e) {
// 失败的话打印日志
logger.error("发送邮件失败" + e.getMessage());
}
}
}
3. 测试
1. 发送普通文本
在发送的时候要在邮箱中要生成授权码复制授权码
然后将 application.properties 配置文件中的 mail 邮箱密码设置为 刚刚复制的授权码,之后就可以测试发送邮件了。
@SpringBootTest
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = CommunityApplication.class)
public class MailTests {
@Autowired
private MailClient mailClient;
@Test
public void testTextMail(){
String to = "958691367@qq.com";
String subject = "Test2";
String content = "Welcome.";
mailClient.sendMail(to, subject, content);
}
}
上面程序一执行程序就通过协议访问了 qq 的邮件服务器,把这些信息提交给了服务器,让服务器帮我们把这些东西发送给对方。
2. 利用 thymeleaf 引擎 去发送 HTML 格式的邮件
上面发送的只是普通的文本,接下来我们看怎么利用 thymeleaf 引擎 去发送 HTML 格式的邮件
先创建一个 HTML 文件,然后将第二行修改使其成为 themeleaf 模板
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.themeleaf.org">
<head>
<meta charset="UTF-8">
<title>邮件示例</title>
</head>
<body>
<p>欢迎你,<span style="color: red;" th:text="${username}"></span>!</p>
</body>
</html>
测试类
测试第二个方法 “发送HTML”
@SpringBootTest
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = CommunityApplication.class)
public class MailTests {
@Autowired
private MailClient mailClient;
@Autowired
private TemplateEngine templateEngine;
// 只发送普通的文本
@Test
public void testTextMail(){
String to = "958691367@qq.com";
String subject = "Test4";
String content = "Welcome.";
mailClient.sendMail(to, subject, content);
}
// 测试这个方法
// 发送 HTML
@Test
public void testHtmlMail(){
// 给 themeleaf 模板传参
Context context = new Context();
context.setVariable("username", "sunday");
// 调模板引擎生成动态网页 参数1:模板引擎的路径 参数2:数据
// 会生成一个动态网页,其实就是一个字符串,模板引擎主要的作用就是生成动态网页
String content = templateEngine.process("/mail/demo", context);
System.out.println(content);
// 发邮件 参数1:收件人 参数2:邮件标题 参数3:邮件内容
mailClient.sendMail("958691367@qq.com", "HTML", content);
}
}
themeleaf模板引擎 有一个核心的类,这个类也是被 Spring 管理起来的,需要的话直接注入进来就可以用。
测试结果