springboot 发送邮箱验证码

发布时间 2023-06-05 13:10:54作者: 临安剑客

0 步骤总览

  1. 开启邮箱的 POP3/SMTP 服务。
  2. 新建 springboot 项目。
  3. 导入依赖。
  4. 配置配置文件。
  5. 编写 controller 测试接口。
  6. postman 中测试

1 开启邮箱的 POP3/SMTP 服务

这里我用的网易邮箱,其它邮箱类似步骤,不清楚的可以百度。

总之就是要打开 pop3/smtp 服务,如果按照我的方法找不到,可以百度。

打开后生成授权码,会获得一个授权码,这个授权码很重要,后面会用到。

如果不会生成或没有生成的,百度查一下。

如果是 qq 邮箱,依次点击 设置 =》账户 往下拉就可以找到。

如果没找到,百度即可。

2 新建 springboot 项目

依次点击 文件 =》新建 =》项目,会弹出以下界面:

注意这里的 名称 和 组 都是我改过的,如果没有个性化需求,默认即可。

点击下一步:

版本默认,这里我只勾选了两个依赖,其它的后面补上。

点击创建即可。

我们看一下目录结构:

注意红框里的内容是项目自动生成的我们不需要的部分(如果你的没有自动生成,就不用管)。可以选择删除(强迫症)。

因为个人习惯,我会把 application.properties 文件改为 application.yml 文件。

改造后的:

注意这里的文件名已经被我改了。

配置文件(application.yml)初始内容:

# 应用服务 WEB 访问端口
server:
  port: 8080

3 导入依赖

在 pom.xml 文件第二层标签 dependencies 标签内引入依赖

这里我导入两个依赖,分别是 spring-boot-starter-mail 和 hutool-all

<!-- 邮箱验证码依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<!-- 一个很强大的工具库 -->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.19</version>
</dependency>

这里的 hutool-all 工具库主要用来生成随机验证码(当然它的功能远不止这些)。

更多关于 hutool-all 的信息参考:入门和安装 (hutool.cn)

4 配置配置文件

spring:
  #邮箱验证码配置
  mail:
    #smtp服务主机  qq邮箱则为smtp.qq.com; 163邮箱是smtp.163.com
    host: smtp.163.com
    #服务协议
    protocol: smtp
    # 编码集
    default-encoding: UTF-8
    #发送邮件的账户
    username: xxx@xxx.com
    #授权码
    password: xxx

    # 昵称
    nickname: 临安剑客

    test-connection: true
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true
            required: true

注意这里的 password 就是第一步时生成的授权码。

其中的 username 是你第一步中操作的邮箱账号。

nickname 是接收者收到邮件中显示的发件人。

host 是根据服务主机区分,网易163 邮箱是 smtp.163.com, qq 邮箱是 smtp.qq.com。

其它的默认即可。

5 controller 测试接口

@RestController
@RequestMapping("/email")
public class EmailController {

    // 这个是 mail 依赖提供给我们的发送邮件的接口
    @Autowired
    private JavaMailSender mailSender;

    // 获取发件人邮箱
    @Value("${spring.mail.username}")
    private String sender;

    // 获取发件人昵称
    @Value("${spring.mail.nickname}")
    private String nickname;

    /**
     * 获取验证码
     * @param email 收件人
     * @return 验证码信息
     */
    @GetMapping("/code")
    public String getCode(@RequestParam("email")String email){

        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(nickname + '<' + sender + '>');
        message.setTo(email);
        message.setSubject("欢迎访问临安剑客");

        // 使用 hutool-all 生成 6 位随机数验证码
        String code = RandomUtil.randomNumbers(6);

        String content = "【验证码】您的验证码为:" + code + " 。 验证码五分钟内有效,逾期作废。\n\n\n" +
                "------------------------------\n\n\n" +
                "更多博客可访问:\n\n" +
                "https://www.cnblogs.com/huang-guosheng/\n\n" +
                "或\n\n" +
                "https://blog.itsheng.cn/";

        message.setText(content);

        mailSender.send(message);

        return "发送成功!";
    }

}

6 测试

运行项目后在 postman 中测试接口:

打码的地方就是需要你输入自己接收邮件的邮箱。

接收效果:

可以看到,邮件发送成功

7 附录

这里贴出一些关键文件代码:

pom.xml

<?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>
    <groupId>cn.itsheng.email</groupId>
    <artifactId>EmailTest</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>EmailTest</name>
    <description>EmailTest</description>
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.6.13</spring-boot.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</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>

        <!-- 邮箱验证码依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

        <!-- 一个很强大的工具库 -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.19</version>
        </dependency>


    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>cn.itsheng.email.emailtest.EmailTestApplication</mainClass>
                    <skip>true</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

application.yml

# 应用服务 WEB 访问端口
server:
  port: 8080

spring:
  #邮箱验证码配置
  mail:
    #smtp服务主机  qq邮箱则为smtp.qq.com; 163邮箱是smtp.163.com
    host: smtp.163.com
    #服务协议
    protocol: smtp
    # 编码集
    default-encoding: UTF-8
    #发送邮件的账户
    username: xxx@xxx.com
    #授权码
    password: xxx

    # 昵称
    nickname: 临安剑客

    test-connection: true
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true
            required: true

注意这里的 host、username、password(授权码)、nickname 要因人而异的。其中 host 和你使用的邮箱服务商有关。

EmailController

package cn.itsheng.email.emailtest.controller;

import cn.hutool.core.util.RandomUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;


@RestController
@RequestMapping("/email")
public class EmailController {

    // 这个是 mail 依赖提供给我们的发送邮件的接口
    @Autowired
    private JavaMailSender mailSender;

    // 获取发件人邮箱
    @Value("${spring.mail.username}")
    private String sender;

    // 获取发件人昵称
    @Value("${spring.mail.nickname}")
    private String nickname;

    /**
     * 获取验证码
     * @param email 收件人
     * @return 验证码信息
     */
    @GetMapping("/code")
    public String getCode(@RequestParam("email")String email){

        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(nickname + '<' + sender + '>');
        message.setTo(email);
        message.setSubject("欢迎访问临安剑客");

        // 使用 hutool-all 生成 6 位随机数验证码
        String code = RandomUtil.randomNumbers(6);

        String content = "【验证码】您的验证码为:" + code + " 。 验证码五分钟内有效,逾期作废。\n\n\n" +
                "------------------------------\n\n\n" +
                "更多博客可访问:\n\n" +
                "https://www.cnblogs.com/huang-guosheng/\n\n" +
                "或\n\n" +
                "https://blog.itsheng.cn/";

        message.setText(content);

        mailSender.send(message);

        return "发送成功!";
    }
}