2.1 在项目中如何给用户发送邮件

539 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情

在开发的时候经常会有给用户发送短信验证码的功能,下面的文章就是介绍如何在项目中如何给用户发送验证码。

发送邮件

image-20220707101812868

分三步:

  1. 邮箱设置
  2. Spring Email
  3. 模板引擎

1. 邮件设置

  1. 邮箱的设置

首先我们进入第一个环节:邮箱的设置

这里我们使用qq邮箱(其他的邮箱也是一样的)

image-20220707102847334

开启 POP3/SMTP 服务去发送邮件

image-20220707102924364


2. Spring Email如何使用

  1. 怎么去使用 Spring Email

接下来是第二步,怎么去使用 Spring Email

  • 引入 spring mail 依赖

首先需要引入 spring mail 依赖,可以去maven中心仓库搜索

image-20220707103616901

之后将依赖粘贴到项目的 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

image-20220707124015613

  • 使用 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());
        }


    }


}

image-20220707124243880

3. 测试

1. 发送普通文本

在发送的时候要在邮箱中要生成授权码复制授权码

image-20220707121334403

image-20220707122851441

然后将 application.properties 配置文件中的 mail 邮箱密码设置为 刚刚复制的授权码,之后就可以测试发送邮件了。

image-20220707123043797

@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 的邮件服务器,把这些信息提交给了服务器,让服务器帮我们把这些东西发送给对方。

image-20220707124532050

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>

image-20220707134342902

测试类

测试第二个方法 “发送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 管理起来的,需要的话直接注入进来就可以用。

image-20220707135451905

image-20220707140911376

测试结果

image-20220707141201556