Bootstrap

使用邮箱发送验证码

背景

使用邮箱发送验证码(通常称为“邮箱验证”或“邮箱验证码”)作为身份验证的一部分,是现代互联网服务中非常常见的一种做法。这种做法的背景主要基于以下几个方面的需求和考虑:

  1. 提升账户安全性
    • 在用户注册、登录、修改关键信息(如密码、邮箱地址、手机号码等)时,通过邮箱发送验证码可以有效防止自动化工具或恶意用户进行非法操作,如暴力破解密码、账户劫持等。
    • 验证码的临时性和一次性特点,确保了只有合法用户(即能够访问指定邮箱的用户)才能完成相关操作,从而提高了账户的安全性。
  2. 确认用户身份
    • 在一些关键操作前,如绑定新的支付方式、更改重要设置或执行高价值交易时,通过邮箱验证码进行二次验证,可以进一步确认操作者的身份,防止账户被未授权人员使用。
    • 这种方式特别适用于那些可能涉及个人隐私、财产安全或敏感数据访问的场景。
  3. 减少垃圾注册和滥用
    • 在注册流程中引入邮箱验证码步骤,可以大大增加恶意用户批量注册垃圾账户的难度和成本,从而保护网站或应用的正常运行,减少资源消耗。
    • 同时,这也为平台提供了识别并阻止潜在滥用行为的机会,如恶意刷单、发布违规内容等。
  4. 用户体验与合规性
    • 虽然增加了操作步骤,但合理的引导和设计可以使这一过程变得顺畅且易于理解,从而提升用户体验。
    • 在一些国家和地区,出于数据保护和个人隐私的法律规定,使用邮箱验证码进行身份验证是符合法规要求的做法。
  5. 应对多因素认证的需求
    • 随着网络安全威胁的不断升级,多因素认证(MFA)成为了许多企业和服务的标准安全实践。邮箱验证码作为多因素认证中的一种因素,可以与其他因素(如密码、手机验证码、生物识别等)结合使用,为账户安全提供更为坚实的保障。

步骤

导入依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
            <version>2.6.1</version>
        </dependency>

生成验证码

 String code = StringTools.getRandomNumber(Constants.LENGTH_5);

这里我是封装了自己的方法,也可以使用Math.random()或者Random类

import java.util.Random;  
  
public class RandomNumberExample {  
    public static void main(String[] args) {  
        // 创建一个Random对象  
        Random random = new Random();  
  
        // 生成一个5位随机数(10000到99999之间)  
        int randomNumber = random.nextInt(90000) + 10000;  
  
        // 打印随机数  
        System.out.println("生成的5位随机数是: " + randomNumber);  
    }  
}

 发送邮件

@Resource
    private JavaMailSender javaMailSender;
private void sendEmailCode(String toEmail, String code) {
        try {
            MimeMessage message = javaMailSender.createMimeMessage();

            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            //邮件发件人
            helper.setFrom("发件人邮箱");
            //邮件收件人 1或多个
            helper.setTo(toEmail);
            //邮件主题
            helper.setSubject("标题");
            //邮件内容
            helper.setText("内容");
            //邮件发送时间
            helper.setSentDate(new Date());
            javaMailSender.send(message);
        } catch (Exception e) {
            logger.error("邮件发送失败", e);
            throw new Exception("邮件发送失败");
        }
    }

;