基于springboot实现注册功能发送激活码至邮箱激活账户登录

你是否在某些网站注册账户,注册时输入的邮箱,会收到激活的一串链接,邮箱点击进去此链接后才能激活账户的情况呢,相信你应该也遇到过。那这个功能大概是怎么实现的呢?今天我就带你们来分析分析。

此功能是基于java开发的,用springboot所完成的。

激活原理

在您注册的时候,User类中设置一个邮件码code,同时用户状态未激活。邮件码可以通过UUID实现,这样在注册的时候发送一封邮件,把这个邮件码以html的格式发送到指定邮箱,然后通过点击链接,把邮件码在提交到后台进行对比,如果邮件中的邮件码跟发送时设置的一样,就把用户状态改为激活,然后登陆即可。

运行说明(重点)

由于邮箱在收到激活链接时,需要点击链接访问到线上的地址才可激活,如果是本地localhost运行的地址,点击邮箱激活链接会找不到地址哦,找不到地址则就无法激活当前账户登录的权限了,故此项目就失去了运行实例的意义。 一定要注意 一定要注意 一定要注意。重要的话说三遍!! 建议使用自己的服务器进行访问。
在此项目的测试演示中,使用的是Ngrok内网穿透所演示的,会把本地端口映射通过特定的网址进行访问

Ngrok 内网端口映射,在线访问项目一看即会.
另一篇博文链接 https://blog.csdn.net/qq_41157588/article/details/115755791

实例演示(重点)

注意:此demo使用的是qq邮箱的stmp进行发送的邮箱,项目中application.properties的配置需要更改为自己的qq邮箱stmp的服务(qq邮箱->设置->账户->翻到底部 开启IMAP/SMTP服务), 不懂的可百度搜索,开启后要在自己项目的application中配置自己的stmp服务邮箱及密码,如不使用qq的stmp服务可在百度搜索其他邮箱stmp开启方法,在项目的applicaion.properties根据注释 自行配置即可

如本地的localhost:8080链接访问,点击邮箱地址会访问不到本地,需要服务端地址,此处已做重点说明!!推荐配合 服务器 或 Ngrok内网穿透 的链接地址,点击邮箱链接会进行激活账户.

代码说明

此代码的演示是发送邮件至邮箱激活,点击邮箱链接后激活此账户 。   还存在一些bug。例如:用户名和邮箱已存在还可再次注册 发送邮件等,需要自己后期加入条件判断做进一步的优化,如账户已存在则给予提示等等

复制此项目代码重点修改application.properties的配置 和UserServiceImplsuccess.html 的链接地址

QQ邮箱为例,开启stmp服务
在这里插入图片描述
开启之后,复制生成的stmp的一串字符,配置到application.properties即可

接下来直奔主题

注册用户,输入邮箱
在这里插入图片描述
注册时,成功发送邮箱至邮箱激活的链接激活信息,点击邮箱链接后会激活此账号的登录权限。
在这里插入图片描述
在这里插入图片描述

注册时,数据库的也已经添加了新注册的用户信息
在这里插入图片描述
当不点击了邮箱的激活链接时,code的状态默认为0,此时账户为未激激活状态,不能进行登录。
在这里插入图片描述

当点击了邮箱的链接时,code的状态会改为1,此时账户为激活状态,可以进行登录账户
在这里插入图片描述

如已经成功激活,再次登录刚刚注册的账户,此时会登录成功跳转到登录成功后设置的页面。
在这里插入图片描述

项目结构图

在这里插入图片描述

准备工作

数据库

SQLyog Ultimate v12.3.1 (64 bit)
MySQL - 5.7.20-log 
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;

create table `useremail` (
	`id` int (11),
	`username` varchar (150),
	`password` varchar (150),
	`useremail` varchar (150),
	`status` int (11),
	`code` varchar (600)
); 

insert into `useremail` (`id`, `username`, `password`, `useremail`, `status`, `code`) values('1','admin','123456','1136720013@qq.com','1','');
insert into `useremail` (`id`, `username`, `password`, `useremail`, `status`, `code`) values('2','aaa','aaaaaa','483444018@qq.com','0','c14dcdb9c63c4ad7980bda0beb1fcbe4e1f6ba7baa704966a6f9f2ac18acf075');

emailactivate项目详细代码

根据以上项目结构图由上而下提供代码
com.lemon.emailactivate

common

UUIDUtils
package com.lemon.emailactivate.common;

import java.util.UUID;

/**
 * @Author: xiangti
 * @Description:使用UUIDUtils生产发送给用户的邮箱验证码
 * @Date: Create in 2020/5/29 18:32
 */
public class UUIDUtils {
    public static String getUUID() {
        return UUID.randomUUID().toString().replace("-", "");
    }
}

config

DruidDbConfig
package com.lemon.emailactivate.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Created by lemon on 2020/5/29 18:32
 * @author xiangti
 * @CoonfigurationProperties(prefix="xxx")两种配置方法
 */
@Configuration
public class DruidDbConfig {
    private Logger logger = LoggerFactory.getLogger(DruidDbConfig.class);

    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    public DruidDataSource druidConfig() {

        return new DruidDataSource();
    }
}

controller

IndexController
package com.lemon.emailactivate.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @Author: xiangti
 * @Description:
 * @Date: Create in 2020/5/29 18:34
 */
@Controller
public class IndexController {
    /**
     * 首页
     */
    @RequestMapping(value = "/")
    public String index() {
        return "index";
    }
}
UserController

import com.lemon.emailactivate.common.UUIDUtils;
import com.lemon.emailactivate.entity.User;
import com.lemon.emailactivate.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @Author: xiangti
 * @Description:用户注册
 * @Date: Create in 2020/5/29 18:37
 */
@Controller
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 注册
     * @param user
     * @return
     */
    @RequestMapping("/registerUser")
    public String register(User user) {
        user.setStatus(0);
        String code = UUIDUtils.getUUID() + UUIDUtils.getUUID();
        user.setCode(code);
        userService.register(user);
        return "success";
    }

    /**
     * 校验邮箱中的code激活账户
     * 首先根据激活码code查询用户,之后再把状态修改为"1"
     */
    @RequestMapping("/checkCode")
    public String checkCode(String code) {
        User user = userService.checkCode(code);
        System.out.println(user);
        //如果用户不等于null,把用户状态修改status=1
        if (user != null) {
            //已经点击邮箱链接 将状态改为1
            user.setStatus(1);
            //把code验证码清空,已经不需要了
            user.setCode("");
            System.out.println(user);
            userService.updateUserStatus(user);
        }
        return "login";
    }
    /**
     * 跳转到注册页面
     * @return login
     */
    @RequestMapping("/indexPage")
    public String index() {
        return "index";
    }

    /**
     * 跳转到登录页面
     * @return login
     */
    @RequestMapping("/loginPage")
    public String login() {
        return "login";
    }


    /**
     * 登录
     */
    @RequestMapping("/loginUser")
    public String login(User user, Model model) {
        User u = userService.loginUser(user);

        if (u != null) {
            //登录成功  跳转到welcome欢迎页
            return "welcome";
        } else {
            model.addAttribute("msg", "用户名或密码有误,请确认是否已激活!");
            return "login";
        }

    }
}

dao

UserDao

import com.lemon.emailactivate.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

/**
 * @Author: xiangti
 * @Description:
 * @Date: Create in 2020/5/29 18:31
 */
@Mapper
public interface UserDao {
    /**
     * 用户注册,注册的时候默认状态为0:未激活,并且调用邮件服务发送激活码到邮箱
     *
     * @param user
     */
    void register(User user);

    /**
     * 点击邮箱中的激活码进行激活,根据激活码查询用户,之后再进行修改用户状态为1进行激活
     *
     * @param code
     * @return
     */
    User checkCode(String code);

    /**
     * 激活账户,修改用户状态为“1”进行激活
     *
     * @param user
     */
    void updateUserStatus(User user);

    /**
     * 登录,根据用户状态为“1”来查询
     *
     * @param user
     * @return
     */
    User loginUser(User user);

    /**
     * 查出当前用户的状态
     *
     * @param status
     * @return
     */
    User selStatus(String status);

}

entity

User
package com.lemon.emailactivate.entity;

import java.io.Serializable;

/**
 * @Author: xiangti
 * @Description:
 * @Date: Create in 2020/5/12 18:30
 */
public class User implements Serializable {
    private Integer id;
    private String username;
    private String password;
    private String useremail;
    /**
     * 状态:0代表未激活,1代表激活
     */
    private Integer status;
    /**
     * 利用UUID生成一段数字,发动到用户邮箱,当用户点击链接时
     * 在做一个校验如果用户传来的code跟我们发生的code一致,更改状态为“1”来激活用户
     */
    private String code;

    public Integer getId() {
        return id;
    }


    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public String getUseremail() {
        return useremail;
    }

    public void setUseremail(String useremail) {
        this.useremail = useremail;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public String getCode() {
        return code;
    }

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

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", useremail='" + useremail + '\'' +
                ", status=" + status +
                ", code='" + code + '\'' +
                '}';
    }
}

service

UserService
package com.lemon.emailactivate.service;


import com.lemon.emailactivate.entity.User;

/**
 * @Author: xiangti
 * @Description:
 * @Date: Create in 2020/5/12/29 18:32
 */
public interface UserService {
    /**
     * 用户注册
     *
     * @param user
     */
    void register(User user);

    /**
     * 根据激活码code查询用户,之后再进行修改状态
     *
     * @param code
     * @return
     */
    User checkCode(String code);

    /**
     * 激活账户,修改用户状态
     *
     * @param user
     */
    void updateUserStatus(User user);

    /**
     * 登录,根据用户状态为“1”来查询
     *
     * @param user
     * @return
     */
    User loginUser(User user);
}

UserServiceImpl
package com.lemon.emailactivate.service.impl;

import com.lemon.emailactivate.dao.UserDao;
import com.lemon.emailactivate.entity.User;
import com.lemon.emailactivate.service.EmailService;
import com.lemon.emailactivate.service.UserService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    /**
     * 注入邮件接口
     */
    @Autowired
    private EmailService mailService;

    /**
     * 用户注册,同时发送一封激活邮件
     *
     * @param user
     */
    @Override
    public void register(User user) {
        userDao.register(user);

        //获取激活码
        String code = user.getCode();
        System.out.println("code:" + code);
        //主题
        String subject = "来自激活用户认证的邮件";

        //user/checkCode?code=code(激活码)是我们点击邮件链接之后根据激活码查询用户,如果存在说明一致,将用户状态修改为“1”激活
        //上面的激活码发送到用户注册邮箱
        //**************************************本地测试的路径 会失效。**************************************************************
        //String context = "<a href=\"/user/checkCode?code="+code+"\">激活请点击:"+code+"</a>";
        //String context = "<a href=\"http://localhost:8080/user/checkCode?code="+code+"\">激活请点击:"+code+"</a>";
        //*************************************************************************************************************************

        //user/checkCode?code=code(激活码)是我们点击邮件链接之后根据激活码查询用户,如果存在说明一致,将用户状态修改为“1”激活
        //上面的激活码发送到用户注册邮箱
        //注意:此处的链接地址,是项目内部地址,如果我们没有正式的服务器地址,暂时无法从qq邮箱中跳转到我们自己项目的激活页面

        //方式1 注意看上述说明(如不服务器测试 把上面本地代码链接注释)
        String context = "<a href=\"服务器端地址/user/checkCode?code=" + code + "\">激活用户认证请点击=> " + code + "</a>";
        //方式2 注意看上述说明(如不服务器测试 把上面本地代码取消注释)
        //String context = "<a href='服务端地址/user/checkCode?code='+code+'>激活用户认证请点击=> '+code+'</a>";

        //发送激活邮件
        mailService.sendHtmlMail(user.getUseremail(), subject, context);
    }

    /**
     * 根据激活码code进行查询用户,之后再进行修改状态
     *
     * @param code
     * @return
     */
    @Override
    public User checkCode(String code) {

        return userDao.checkCode(code);
    }

    /**
     * 激活账户,修改用户状态
     *
     * @param user
     */
    @Override
    public void updateUserStatus(User user) {
        userDao.updateUserStatus(user);
    }

    /**
     * 登录
     *
     * @param user
     * @return
     */
    @Override
    public User loginUser(User user) {
        User user1 = userDao.loginUser(user);
        if (user1 != null) {
            return user1;
        }
        return null;
    }
}
EmailService
package com.lemon.emailactivate.service;

/**
 * @Author: xiangti
 * @Description:
 * @Date: Create in 2020/5/12/29 18:32
 */
public interface EmailService {

    /**
     * 发送文本邮件,注册部分用不到
     * @param to
     * @param subject
     * @param content
     */
    //void sendSimpleMail(String to, String subject, String content);

    /**
     * 发送HTML邮件,方便用户点击附带的code用来验证激活账户
     *
     * @param to      收件人
     * @param subject 主题
     * @param content 内容
     */
    void sendHtmlMail(String to, String subject, String content);
}

EmailServiceImpl
package com.lemon.emailactivate.service.impl;

import com.lemon.emailactivate.service.EmailService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;

/**
 * @Author: xiangti
 * @Description:
 * @Date: Create in 2020/5/12/ 18:20
 */
@Service
public class EmailServiceImpl implements EmailService {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    @Autowired
    private JavaMailSender mailSender;
    /**
     * 配置文件中我的qq邮箱
     */
    @Value("${spring.mail.from}")
    private String from;

    /**
     * 发送HTML邮件
     *
     * @param to      收件者
     * @param subject 邮件主题
     * @param content 文本内容
     */
    @Override
    public void sendHtmlMail(String to, String subject, String content) {
        MimeMessage message = mailSender.createMimeMessage();
        MimeMessageHelper helper = null;
        try {
            helper = new MimeMessageHelper(message, true);
            //邮件发送人
            helper.setFrom(from);
            //邮件主题
            helper.setSubject(subject);
            //邮件接收人
            helper.setTo(to);
            //邮件内容
            helper.setText(content, true);
            //发送邮件
            mailSender.send(message);
            //日志信息
            logger.info("邮件已经发送。");
        } catch (MessagingException e) {
            logger.error("发送邮件时发生异常!", e);
        }
    }
}

EmailactivateApplication启动类

package com.lemon.emailactivate;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
//@MapperScan("com.lemon.emailactivate.dao")  //等同于 dao接口的@Mapper注解
public class EmailactivateApplication {

    public static void main(String[] args) {
        SpringApplication.run(EmailactivateApplication.class, args);
    }

}

resources

mapper

UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >

<mapper namespace="com.lemon.emailactivate.dao.UserDao">
    <!--注册用户-->
    <insert id="register" parameterType="User">
        insert into useremail ( username, password,useremail,status,code)
        values (#{username,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, #{useremail,jdbcType=VARCHAR},
        #{status,jdbcType=INTEGER},#{code,jdbcType=INTEGER})
    </insert>

    <!--根据激活码code查询用户-->
    <select id="checkCode" parameterType="String" resultType="User">
        select * from useremail where code = #{code}
    </select>

    <!--激活账户,修改用户状态-->
    <update id="updateUserStatus" parameterType="User">
        update useremail set status=1,code=null where id=#{id}
    </update>

    <!--登录,根据 status=1 进行查询-->
    <select id="loginUser" resultType="User">
        select * from useremail where username=#{username} and password=#{password} and status=1
    </select>

</mapper>

templates

error

404.html
500.html

可自行百度搜索报错页面效果,也可不写404和500页面。

index.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>注册页面</title>
    <!-- 引入 Bootstrap在线cdn -->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>

<div class="row clearfix" style="text-align: center">
    <div class="page-header">
        <h1>
            <small>注册中心</small>
        </h1>
    </div>
</div>

<div align="center">
    <form action="/user/registerUser" method="post" style="width: 30%">
        <div class="form-group">
            <label for="username">用户名</label><br>
            <input type="text" class="form-control" id="username" maxlength="10" name="username" placeholder="请输入注册的用户名"
                   required/>
            <br>
        </div>

        <div class="form-group">
            <label for="password">登录密码</label><br>
            <input type="password" class="form-control" maxlength="16" id="password" name="password"
                   placeholder="请输入注册的密码" required/><br>
        </div>

        <div class="form-group">
            <label for="email">邮箱地址</label><br>
            <input type="email" class="form-control" id="email" name="useremail" placeholder="请输入可接收邮件的邮箱" required><br>
        </div>


        <input type="submit" class="btn btn-primary" value="确认注册" onclick="return confirm('确认注册吗?')"/>
    </form>
</div>

<div class="row clearfix" style="text-align: center">
    <br>
    <a href="/user/loginPage" class="btn btn-warning">去登录页面</a>
</div>

</body>
</html>

login.html

<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
    <!-- 引入 Bootstrap在线cdn -->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>

<div class="row clearfix" style="text-align: center">
    <div class="page-header">
        <h1>
            <small>登录页面</small>
        </h1>
    </div>
</div>

<div align="center">
    <form action="/user/loginUser" method="post" style="width: 30%">
        <!--如果msg的值为空 不显示提示的信息-->
        <span th:text="${msg}" th:if="${not #strings.isEmpty(msg)}" style="color: red"></span>
        <span th:text="${status}" style="color: pink"></span>
        <div class="form-group">
            <label for="username">用户名</label><br>
            <input type="text" class="form-control" id="username" maxlength="10" name="username" placeholder="请输入您的账户"
                   required style="width: 60%"/><br>
        </div>

        <div class="form-group">
            <label for="password">密码</label><br>
            <input type="password" class="form-control" maxlength="16" id="password" name="password"
                   placeholder="请输入您的密码" required style="width: 60%"/><br>
        </div>

        <!--判断是否激活用的-->
        <!--<input type="hidden" name="status" value="1">-->

        <input type="submit" class="btn btn-primary" value="登录账号"/>
    </form>
</div>

<div class="row clearfix" style="text-align: center">
    <br>
    <a href="/user/indexPage" class="btn btn-warning">去注册页面</a>
</div>

</body>
</html>

success.html

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册成功</title>
    <!-- 引入 Bootstrap在线cdn -->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<script type="text/javascript">
    function countDown(secs, surl) {
        //alert(surl);
        var jumpTo = document.getElementById('jumpTo');
        jumpTo.innerHTML = secs;
        if (--secs > 0) {
            setTimeout("countDown(" + secs + ",'" + surl + "')", 1000);
        } else {
            location.href = surl;
        }
    }
</script>
<body>

<div class="row clearfix" style="text-align: center;background-color: pink;color: blue;margin-top: 30px">
    <div style="font-size: 20px">
        <span>邮件已成功发送,请点击邮箱链接激活用户哦~ </span>
        <span id="jumpTo" style="color: black">15</span>秒后将自动跳转到登录页
    </div>
</div>
<script type="text/javascript">
    // 15 秒后跳转的页面

    countDown(15,'http://localhost:8080/user/loginPage');//地测试的路径(15s后自动跳转到登录页)
    //countDown(15, 'http://服务端地址/user/loginPage');//服务器测试的路径
</script>

</body>
</html>

welcome.html

处的欢迎页是我找的源码设置的,欢迎页可自定义为自己想设置的内容,此欢迎页效果图如下图所示,可自己更改。
在这里插入图片描述

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>welcome</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        body {
            overflow: hidden;
        }

        /*canvas{ background: #0c0c0c; }*/
    </style>
</head>
<body>
<canvas id="canvas"> 您的浏览器不支持canvas标签,请您更换浏览器</canvas>
<script>
    var canvas = document.getElementById("canvas");
    var can = canvas.getContext("2d");
    var s = window.screen;//获取屏幕
    var w = canvas.width = s.width;//获取屏幕宽度
    var h = canvas.height = s.height;//获取屏幕高度

    can.fillStyle = color2();

    var words = Array(256).join("1").split("");
    //设置一个包含256个空元素的数组,join("1")用来把数组里的元素拼接成字符串,split("")过滤掉数组里的空元素

    setInterval(draw, 50);


    // can.font="30px 微软雅黑"; //只设置一个不生效,一定要两个属性都设
    // //绘制实心的文本:绘制的文本,文本的坐标x,文本的坐标y
    // can.fillText("黑客帝国",100,100);
    // // setInterval(draw,50);


    function draw() {
        //can.fillRect()画一个实心矩形:坐标x,坐标y,矩形宽,举行高
        can.fillStyle = 'rgba(0,0,0,0.05)';
        can.fillRect(0, 0, w, h);
        can.fillStyle = color2();
        words.map(function (y, n) {
            text = String.fromCharCode(Math.ceil(65 + Math.random() * 57)); //转换为键盘上值
            x = n * 10;
            can.fillText(text, x, y)
            words[n] = (y > 758 + Math.random() * 484 ? 0 : y + 10);
        });//数组元素的一个映射
    }

    //获取随机颜色,三种方法
    function color1() {
        var colors = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'a', 'b', 'c', 'd', 'e', 'f'];
        var color = "";
        for (var i = 0; i < 6; i++) {
            //Math.random()产生一个0-1之间的小数
            var n = Math.ceil(Math.random() * 15);
            color += "" + colors[n];
            // console.log(color);
        }
        return '#' + color;
    }

    function color2() {
        var color = Math.ceil(Math.random() * 16777215).toString(16);
        // for( var i=color.length; i<6; i++ ){
        // 	color = '0'+color;
        // }
        while (color.length < 6) {
            color = '0' + color;
        }
        return '#' + color;
    }

    function color3() {
        return "#" + (function (color) {
            return new Array(7 - color.length).join("0") + color;
            //神奇的方法,总共字符串有6位,如果只产生了3位,则前面应该补三个0,在长度为7-3=4的空数组中利用join插入0,则为['',0,'',0,'',0,''],刚好三个0补在前面
        })((Math.random() * 0x1000000 << 0).toString(16))
        // << 0 也是一种取整的方法
    }


</script>
</body>
</html>

application.properties

注意设置数据库连接需要更改为自己的,如不是qq邮箱地址 此处要更改邮箱类型地址,此处为qq邮箱。 以及还要配置自己邮箱stmp密码 不会开启邮箱stmp的参考文章顶部方法配置

server.port=8080

# MyBatis相关配置
spring.devtools.remote.restart.enabled=true
spring.devtools.restart.additional-paths=src/main
# 数据库连接配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/数据库?characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=12345678
spring.http.encoding.charset=UTF-8
spring.http.encoding.force=true
spring.http.encoding.enabled=true
server.tomcat.uri-encoding=UTF-8
#MyBatis别名
mybatis.type-aliases-package=com.lemon.emailactivate.entity
mybatis.mapper-locations=mapper/*.xml
spring.thymeleaf.prefix=classpath:/templates/

#QQ smtp.qq.com
#sina smtp.sina.cn
#aliyun smtp.aliyun.com
#163 smtp.163.com
# ↑ 邮箱服务器地址

#此处设置的stmp为qq邮箱
spring.mail.host=smtp.qq.com
#邮箱用户名(使用自己的邮箱)
spring.mail.username=xxx.qq.com
#邮箱密码(注意:qq邮箱应该使用独立密码,去qq邮箱设置里面开启POP3/SMTP服务)
spring.mail.password=输入邮箱stmp字符
#编码格式
spring.mail.default-encoding=UTF-8
##发送邮件地址(使用自己的邮箱)
spring.mail.from=xxxx.qq.com

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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.lemon</groupId>
    <artifactId>emailactivate</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>emailactivate</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--MyBatis-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>

        <!--SpringBoot测试支持-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--MySQL-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!--SpringBoot热部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional> <!-- 这个需要为 true 热部署才有效 -->
        </dependency>

        <!--Druid数据库连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>
        <!--邮件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

        <!--thymeleaf-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

    </dependencies>


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

此代码只供一个发送邮件至邮箱激活,存在一些bug。例如:用户名邮箱已存在还注册 发送邮件等,需要自己后期加入条件判断做进一步的优化

此项目代码已完全提供完毕,如果有遇到问题联系qq1136720013,vx:it566666 ,希望给个赞评论支持一下,感谢支持,你的支持是我创作最大的动力,愿开发道路上一起更进一步!

  • 30
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值