在日常生活中,我们在一个网站中注册一个账户时,每每在提交个人信息后,网站还哀求我们通过手机或邮件来验证,邮件的话大概会是下面这个样子的:
用户通过点击链接从而完成注册,然后才能登录。大概你会想,为什么要这么麻烦直接提交注册不就行了吗?这个中很大一部分缘故原由是为了防止恶意注册。接下来让我们一起来利用最大略的JSP+Servlet的办法来完成一个通过邮箱验证注册的小案例吧。
准备事情1、理解干系协议:动手实践之前,你最好对JSP、Servlet、SMTP协议和POP3协议知识有所理解,如果对邮件收发过程完备不理解的话,可以花点韶光仔细看一下如下图:
2、邮箱授权准备:在理解的上述内容之后,要实现这个案例,首先我们还得有两个邮箱账号,一个用来发送邮件,一个用来吸收邮件。本案例利用QQ邮箱向163邮箱发送激活邮件,因此须要登录QQ邮箱,在设置->账户面板中开启POP3/SMTP做事,以许可我们通过第三方客户端发送邮件:进入发件人邮件空间 -> 设置 -> 账户 –> 开启(POP3/SMT)做事 把稳:仅限QQ邮箱
图一
图二
图三
还要把稳的是,登录以下做事: POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV做事时,须要用到授权码而不是QQ密码,授权码是用于登录第三方邮件客户真个专用密码。因此我们须要得到授权码,以在后面的程序中利用。
3、须要一个jar包:mail-1.4.7.jar
下载地址:https://mvnrepository.com/artifact/javax.mail/mail/1.4.7
Demo代码实现详细步骤如下:
1. 首先创建一个web工程,并加入干系依赖包:
mail-1.4.7.jar 下载地址:https://mvnrepository.com/artifact/javax.mail/mail/1.4.7
2. 利用MySQL创建一张大略的用户表:t_user
create table t_user( id int(11) primary key auto_increment comment '用户id', userName varchar(100) not null comment '用户名', userEmail varchar(100) not null comment '用户邮箱', userPwd varchar(50) not null comment '用户密码', state int(1) not null default 0 comment '用户激活状态:0表示未激活,1表示激活', code varchar(255) not null comment '激活码');
PS:state字段(用来判断用户账号是否激活)和code字段(激活码)
3. 创建一个注书页面
利用JSP创建一个最大略的注书页面(过于大略,代码省略):
页面效果
4. 注册业务逻辑剖析
1、用户填写干系信息,点击注册按钮
2、系统先将用户记录保存到数据库中,个顶用户状态为未激活
3、系统发送一封邮件并关照用户去验证
4、用户登录邮箱并点击激活链接
5、系统将用户状态变动为已激活并关照用户注册成功
.................搞清楚了全体流程,实现起来该当就不难了...................
项目目录构造通过JavaMail发送邮件,详细代码如下:
public class Constants { public static final int CODE_STATUS_EXPIRED = 400;//验证码过期或者没有点击发送验证码 public static final String SEND_EMAIL_ACCOUNT = "2921272303@qq.com";//发件人邮箱账号 public static final String SEND_EMAIL_CODE = "arnsutissvofzfdshj";//授权码(自己的)}
public class UserServiceImpl implements UserService { private UserDao userDao = new UserDaoImpl(); @Override public int addUser(Users users) { //注册天生唯一标识符 String code = UUID.randomUUID().toString().replaceAll("-",""); try { String newpwd = MD5.getMD5(users.getUser_pwd()).toString(); users.setUser_pwd(newpwd); users.setCode(code); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } int result = userDao.addUser(users); if(result > 0){//注册成功 //获取发送邮件工具 EmailUtil emailUtil = new EmailUtil(users.getUser_email(),code); //发起邮箱验证 new Thread(emailUtil).start(); } return result; }}
package com.cnlm.utils;import com.sun.mail.util.MailSSLSocketFactory;import javax.mail.;import javax.mail.internet.AddressException;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeMessage;import java.security.GeneralSecurityException;import java.util.Properties;import java.util.UUID;/ Created with IntelliJ IDEA. User: cnlm Date: 2020/09/014 22:30 Description: JavaMail发送邮件工具类 QQ邮箱账户为发送方,首先须要进入QQ邮箱,找到左上方的设置,然后选择账户,找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV做事,开启pop3,得到授权码 Version: V1.0 /public class EmailUtil implements Runnable{ private String receiveEmail; // 收件人邮箱 private String uuidCode; // uuid唯一激活码 public EmailUtil(String receiveEmail, String uuidCode) { this.receiveEmail = receiveEmail; this.uuidCode = uuidCode; // 天生唯一随机码; } @Override public void run() { // 1.创建连接工具javax.mail.Session // 2.创建邮件工具 javax.mail.Message // 3.发送一封激活邮件 String host = "smtp.qq.com"; // 指定发送邮件的主机smtp.qq.com(QQ)|smtp.163.com(网易) Properties properties = System.getProperties();// 获取系统属性 properties.setProperty("mail.smtp.host", host);// 设置邮件做事器 properties.setProperty("mail.smtp.auth", "true");// 打开认证 //QQ邮箱须要下面这段代码,163邮箱不须要 try { //QQ邮箱须要下面这段代码,163邮箱不须要 MailSSLSocketFactory sf = new MailSSLSocketFactory(); sf.setTrustAllHosts(true); properties.put("mail.smtp.ssl.enable", "true"); properties.put("mail.smtp.ssl.socketFactory", sf); // 1.获取默认session工具 Session session = Session.getDefaultInstance(properties, new Authenticator() { public PasswordAuthentication getPasswordAuthentication() { // 发件人邮箱账号、授权码 return new PasswordAuthentication(Constant.SEND_EMAIL_ACCOUNT, Constant.SEND_EMAIL_CODE); } }); // 2.创建邮件工具 Message message = new MimeMessage(session); // 3.设置发件人 message.setFrom(new InternetAddress(Constant.SEND_EMAIL_ACCOUNT)); // 4.设置收件人 message.addRecipient(Message.RecipientType.TO, new InternetAddress(receiveEmail)); // 5.设置邮件主题 message.setSubject("账号激活"); String content = "<html><head></head><body>" + "<h1>这是一封激活邮件,激活请点击以下链接</h1><h3>" + "<a href='http://localhost:8080/register/checkRegister.do?code=" + uuidCode + "'>http://localhost:8080/register/checkRegister.do?code=" + uuidCode + "</a></h3></body></html>"; message.setContent(content, "text/html;charset=UTF-8"); // 7.发送邮件 Transport.send(message); // 壅塞方法 System.out.println("邮件成功发送!"); } catch (Exception e) { e.printStackTrace(); } }}
PS:自己测试时需修正账号与授权码。
完成后,再有用户提交注册信息时,该当就能收到验证邮件了。用户点击链接后,我们要做的事情便是根据code(利用UUID天生)变动数据库中相应用户的状态,然后提示用户注册结果了。
末了总结:
大略先容了如何利用JavaMail完成了一个带邮箱验证的注册案例,当然在实际开拓中还有许多细节要把稳,例如对用户提交信息的校验,密码进行加密等,此处的大略案例并未详尽处理这些细节。
学会了吗?谁在最须要的时候轻轻拍着我肩膀,谁在最快乐的时候乐意和我分享。我是一个包夜敲代码,想靠技能苟且的程序员。如果以为有点用的话,请绝不留情地关注、点赞、转发。这将是我写出更多优质文章的最强动力!