基于SpringBoot的邮箱验证码-以QQ邮箱为例

前期设置

登录你的QQ邮箱,设置==>>账户,开启授权服务

 按照qq官方系统提示操作完成后,会得到一个授权码,这个时候需要复制下来,后面需要用到

springboot项目的创建就不说了,说关键的地方;

pom.xml

        <!--email-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
        <!--模板引擎-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>

application.yml

    #    邮箱配置
    mail:
        # 配置 SMTP 服务器地址
        host: smtp.qq.com
        # 发送者邮箱
        username: 589xxxx56@qq.com
        # 配置密码,注意不是真正的密码,而是刚刚申请到的授权码
        password: tfpczrcnxkfybahf
        # 端口号465或587
        port: 587
        # 默认的邮件编码为UTF-8
        default-encoding: UTF-8
        # 配置SSL 加密工厂
        properties:
            mail:
                smtp:
                    socketFactoryClass: javax.net.ssl.SSLSocketFactory
                #表示开启 DEBUG 模式,这样,邮件发送过程的日志会在控制台打印出来,方便排查错误
                debug: true

验证码模版

mailtemplate.ftl

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Email Verification Code</title>
</head>
<body style="margin: 0; padding: 0; background-color: #f5f5f5;">
<div style="max-width: 600px; margin: 0 auto;">
    <table cellpadding="0" cellspacing="0" align="center" style="width: 100%; border-collapse: collapse; background-color: #ffffff; font-family: Arial, sans-serif;">
        <tr>
            <th valign="middle" style="height: 60px; padding: 20px; background-color: #0074d3; border-radius: 5px 5px 0 0;">
                <h1 style="margin: 0; color: #ffffff; font-size: 24px;">TITLE</h1>
            </th>
        </tr>
        <tr>
            <td style="padding: 20px;">
                <div style="background-color: #ffffff; padding: 25px;">
                    <h2 style="margin: 10px 0; font-size: 18px; color: #333333;">
                        尊敬的用户,
                    </h2>
                    <p style="margin: 10px 0; font-size: 16px; color: #333333;">
                        感谢您注册我们的产品. 您的账号正在进行电子邮件验证.
                    </p>
                    <p style="margin: 10px 0; font-size: 16px; color: #333333;">
                        验证码为: <span style="color: #1100ff;">{0}</span>
                    </p>
                    <p style="margin: 10px 0; font-size: 16px; color: #333333;">
                        验证码的有效期只有一分钟,请抓紧时间进行验证吧!
                    </p>
                    <p style="margin: 10px 0; font-size: 16px; color: #dc1818;">
                        如果非本人操作,请忽略此邮件
                    </p>
                </div>
            </td>
        </tr>
        <tr>
            <td style="text-align: center; padding: 20px; background-color: #f5f5f5;">
                <p style="margin: 0; font-size: 12px; color: #747474;">
                    XXXXX<br>
                    Contact us: XXXXXXX@qq.com
                </p>
                <p style="margin: 10px 0; font-size: 12px; color: #747474;">
                    This is an automated email, please do not reply.<br>
                    © Company Name
                </p>
            </td>
        </tr>
    </table>
</div>
</body>
</html>

验证码模版最好是由table标签来编写,这个好像是邮箱才能识别到的样式,核心是不能缺少 {0}

自定义邮箱验证码模型类

public class CodeEntity {
    private String code;
    private String msg;

    public CodeEntity() {
    }

    public CodeEntity(String code,String msg) {
        this.code = code;
        this.msg = msg;
    }


    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

设置模版邮箱引擎

EmailEngine.java

import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.MessageFormat;


public class EmailEngine {
    /**
     * 读取邮件模板
     * 替换模板中的信息
     */
    public String buildContent(String title) {
        //加载邮件html模板
        Resource resource = new ClassPathResource("templates/mailtemplate.ftl");
        InputStream inputStream = null;
        BufferedReader fileReader = null;
        StringBuffer buffer = new StringBuffer();
        String line = "";
        try {
            inputStream = resource.getInputStream();
            fileReader = new BufferedReader(new InputStreamReader(inputStream));
            while ((line = fileReader.readLine()) != null) {
                buffer.append(line);
            }
        } catch (Exception e) {
            System.out.println(e);
        } finally {
            if (fileReader != null) {
                try {
                    fileReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        //替换html模板中的参数
        return MessageFormat.format(buffer.toString(), title);
    }

}

编写发送邮件的控制器

import com.example.emailsendcodetest.entity.CodeEntity;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.MailException;

import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.util.Arrays;
import java.util.Map;
import java.util.Random;

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

    @Resource
    private JavaMailSender javaMailSender;
    
    //读取yml文件中username的值并赋值给form
    @Value("${spring.mail.username}")
    private String from;

    @RequestMapping("sendEmail")
    public CodeEntity sendSimpleMail(@RequestParam(value = "emailReceiver") String emailReceiver) throws MessagingException {
        EmailEngine emailEngine = new EmailEngine();
        // 构建一个邮件对象
//        SimpleMailMessage message = new SimpleMailMessage();
        MimeMessage message = javaMailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(message, true);

        //返回给前端的code-json module
        CodeEntity codeEntity = new CodeEntity();
        // 设置邮件发送者
        helper.setFrom(from);
        // 设置邮件接收者
        helper.setTo(emailReceiver);
        // 设置邮件的主题
        helper.setSubject("注册验证码");
        // 设置邮件的正文
        Random random = new Random();
        StringBuilder code = new StringBuilder();
        for (int i = 0; i < 6; i++) {
            int r = random.nextInt(10);
            code.append(r);
        }
        String text = emailEngine.buildContent(code.toString());
        helper.setText(text,true);
        // 发送邮件
        try {
            javaMailSender.send(message);
            codeEntity.setEmail(Arrays.toString(message.getFrom()));
            codeEntity.setCode(code.toString());
            codeEntity.setMsg("success");
            return codeEntity;
        } catch (MailException e) {
            e.printStackTrace();
        }
        codeEntity.setEmail(Arrays.toString(message.getFrom()));
        codeEntity.setCode("null");
        codeEntity.setMsg("fail");
        return codeEntity;
    }

项目结构如图

接口测试

http://localhost/email/sendEmail?emailReceiver=879XXXX23@qq.com

 这样做可以让前端获取数据做校验

用户接收到的的验证码邮件为html格式:

至此,web开发中的验证码模块开发完成。

你想拥有你从未拥有过的东西,就得去做你从未做过的事,加油

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个简单的Spring Boot邮箱验证码注册登录的实现示例: 1. 引入依赖 在pom.xml中加入以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` 2. 配置邮箱信息 在application.properties或application.yml文件中添加邮件相关配置信息: ```properties # 邮箱服务器地址 spring.mail.host=smtp.qq.com # 邮箱服务器端口 spring.mail.port=587 # 邮箱账号 spring.mail.username=your_email@qq.com # 邮箱授权码,非邮箱密码 spring.mail.password=your_email_password # 是否启用ssl spring.mail.properties.mail.smtp.starttls.enable=true ``` 3. 编写注册登录接口 编写一个简单的RestController类,包含以下接口: - 发送验证码接口:根据邮箱地址发送验证码。 - 注册接口:根据邮箱地址和验证码进行注册。 - 登录接口:根据邮箱地址和密码进行登录。 ```java @RestController public class UserController { @Autowired private JavaMailSender mailSender; // 发送验证码接口 @PostMapping("/sendCode") public String sendCode(@RequestParam String email) { String code = generateCode(); // 发送邮件 SimpleMailMessage message = new SimpleMailMessage(); message.setFrom("your_email@qq.com"); message.setTo(email); message.setSubject("验证码"); message.setText("您的验证码是:" + code); mailSender.send(message); return code; } // 注册接口 @PostMapping("/register") public String register(@RequestParam String email, @RequestParam String code) { // 校验验证码 // 根据邮箱验证码进行注册 return "注册成功"; } // 登录接口 @PostMapping("/login") public String login(@RequestParam String email, @RequestParam String password) { // 根据邮箱和密码进行登录 return "登录成功"; } // 生成随机验证码 private String generateCode() { String codeChars = "0123456789"; StringBuilder sb = new StringBuilder(); Random random = new Random(); for (int i = 0; i < 6; i++) { int index = random.nextInt(codeChars.length()); sb.append(codeChars.charAt(index)); } return sb.toString(); } } ``` 4. 测试接口 使用Postman等工具测试上述接口。例如: - 发送验证码接口:POST http://localhost:8080/sendCode?email=your_email@qq.com - 注册接口:POST http://localhost:8080/register?email=your_email@qq.com&code=123456 - 登录接口:POST http://localhost:8080/login?email=your_email@qq.com&password=your_password 以上示例仅为参考,实际应用中还需要进行参数校验、异常处理等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值