JavaMail实现邮箱激活功能

一.软件安装及资源准备

1.下载并安装易邮邮箱服务器和Foxmail邮箱客户端

易邮邮箱服务器下载地址:https://download.csdn.net/download/qq_20788055/10496104

Foxmail邮箱客户端下载地址:https://download.csdn.net/download/qq_20788055/10496096



2.创建邮箱账号(直接点击“新账号”创建)

3.添加邮箱账号至FoxMail客户端

4.所需jar包下载地址:https://download.csdn.net/download/qq_20788055/10495554

二.创建数据库及开发项目

1.创建数据表(regist)

2.开发项目

(1)创建实体类UserVO

public class UserVO {
	private String uid;
	private String username;
	private String password;
	private String nickname;
	private String email;
	private String state;
	private String code;
	
	public String getUid() {
		return uid;
	}
	public void setUid(String uid) {
		this.uid = uid;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getNickname() {
		return nickname;
	}
	public void setNickname(String nickname) {
		this.nickname = nickname;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getState() {
		return state;
	}
	public void setState(String state) {
		this.state = state;
	}
	public String getCode() {
		return code;
	}
	public void setCode(String code) {
		this.code = code;
	}

}

(2)创建控制层--RegistServlet

package com.javamail.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.javamail.service.UserService;
import com.javamail.service.impl.UserServiceImpl;
import com.javamail.utils.UUIDUtil;
import com.javamail.vo.UserVO;

/**
 * Servlet implementation class UserServlet
 */
public class RegistServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public RegistServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//response.getWriter().append("Served at: ").append(request.getContextPath());
		request.setCharacterEncoding("UTF-8");
		
		//获取数据
		String username=request.getParameter("yourname");
		String password=request.getParameter("yourpass");
		String nickname=request.getParameter("nickname");
		String email=request.getParameter("youremail");
		
		//封装数据
		UserVO user=new UserVO();
		user.setUid(UUIDUtil.getUUID());
		user.setUsername(username);
		user.setNickname(nickname);
		user.setPassword(password);
		user.setEmail(email);
		user.setState("0");//0-未激活  1-已激活
		user.setCode(UUIDUtil.getUUID()+UUIDUtil.getUUID());
		
		//保存数据
		UserService userService=new UserServiceImpl();
		userService.regist(user);
		
		//页面跳转
		request.setAttribute("msg", "您已注册成功,请去邮箱激活!");
		request.getRequestDispatcher("/msg.jsp").forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

(3)创建业务层--UserService

package com.javamail.service.impl;

import com.javamail.dao.UserDAO;
import com.javamail.dao.impl.UserDAOImpl;
import com.javamail.service.UserService;
import com.javamail.utils.MailUtil;
import com.javamail.vo.UserVO;

public class UserServiceImpl implements UserService{

	@Override
	public void regist(UserVO user) {
		
		//将数据存入数据库
		UserDAO userDAO=new UserDAOImpl();
		userDAO.regist(user);
		
		//发送激活邮件
		MailUtil.sendMail(user.getEmail(), user.getCode());
	}

	@Override
	public UserVO findUserByCode(String code) {
		UserDAO userDAO=new UserDAOImpl();
		return userDAO.findUserByCode(code);
	}

	@Override
	public void updateUser(UserVO user) {
		UserDAO userDAO=new UserDAOImpl();
		userDAO.updateUser(user);
		
	}

}

(4)编写持久层--UserDAO

其中用到LZ自己封装的JDBC工具类,源码地址:https://github.com/Jasper2s/Study_Imooc/tree/master/JavaMail/src/com/javamail/utils

package com.javamail.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import com.javamail.dao.UserDAO;
import com.javamail.utils.JDBCUtil;
import com.javamail.vo.UserVO;

public class UserDAOImpl implements UserDAO{

	@Override
	public void regist(UserVO user) {
		Connection conn=null;
		PreparedStatement st=null;
		ResultSet rs=null;
		JDBCUtil jdbcUtil=JDBCUtil.getInstance();
		try {
			conn=jdbcUtil.getConnection();
			String sql="insert into regist values(?,?,?,?,?,?,?)";
			st=conn.prepareStatement(sql);
			st.setString(1, user.getUid());
			st.setString(2, user.getUsername());
			st.setString(3, user.getPassword());
			st.setString(4, user.getNickname());
			st.setString(5, user.getEmail());
			st.setString(6, user.getState());
			st.setString(7, user.getCode());
			st.execute();
		} catch (Exception e) {
			e.printStackTrace();
		} finally{
			jdbcUtil.close(rs, st, conn);
		}
		
	}

	@SuppressWarnings("null")
	@Override
	public UserVO findUserByCode(String code) {
		Connection conn=null;
		PreparedStatement st=null;
		ResultSet rs=null;
		UserVO user=new UserVO();
		JDBCUtil jdbcUtil=JDBCUtil.getInstance();
		try {
			conn=jdbcUtil.getConnection();
			String sql="select * from regist where code=?";
			st=conn.prepareStatement(sql);
			st.setString(1, code);
			rs=st.executeQuery();
			while(rs!=null&&rs.next()){
				String uid=rs.getString("uid");
				String username=rs.getString("username");
				String nickname=rs.getString("nickname");
				String email=rs.getString("email");
				String state=rs.getString("state");
				
				user.setUid(uid);
				user.setUsername(username);
				user.setNickname(nickname);
				user.setEmail(email);
				user.setState(state);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			jdbcUtil.close(rs, st, conn);
		}
		return user;
	}

	@Override
	public void updateUser(UserVO user) {
		Connection conn=null;
		PreparedStatement st=null;
		ResultSet rs=null;
		JDBCUtil jdbcUtil=JDBCUtil.getInstance();
		try {
			conn=jdbcUtil.getConnection();
			String sql="update regist set username=?,password=?,nickname=?,email=?,state=?,code=? where uid=?";
			st=conn.prepareStatement(sql);
			st.setString(1, user.getUsername());
			st.setString(2, user.getPassword());
			st.setString(3, user.getNickname());
			st.setString(4, user.getEmail());
			st.setString(5, user.getState());
			st.setString(6, user.getCode());
			st.setString(7, user.getUid());
			st.execute();
		} catch (Exception e) {
			e.printStackTrace();
		} finally{
			jdbcUtil.close(rs, st, conn);
		}
	}

}

(5)编写邮箱发送的工具类--MailUtil

发送激活邮件的一般步骤:创建连接对象连接到邮箱服务器-->创建邮件对象(设置发件人,收件人,主题,正文)-->发送邮件

package com.javamail.utils;

import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;

/**
 * 邮件发送工具类
 * @author qiuzhiwen
 *
 */
public class MailUtil {
	
	public static void sendMail(String to,String code){
		Properties props=new Properties();
		//props.setProperty("host", "");
		//1.创建连接对象,连接到邮箱服务器
		Session session=Session.getInstance(props, new Authenticator() {
			@Override
			protected PasswordAuthentication getPasswordAuthentication() {
				return new PasswordAuthentication("[email protected]", "123");
			}
		});
		//2.创建邮件对象
		Message message=new MimeMessage(session);
		try {
			//设置发件人
			message.setFrom(new InternetAddress("[email protected]"));
			//设置收件人
			message.setRecipient(RecipientType.TO, new InternetAddress(to));
			//设置邮件的主题
			message.setSubject("来自XXX网站的激活邮件");
			//设置邮件的正文
			message.setContent("<h1>来自XXX网站的激活邮件,激活请点击以下链接:</h1><br/><h3><a href='http://localhost:8080/JavaMail/ActiveServlet?code="+code+"'>http://localhost:8080/JavaMail/ActiveServlet?code="+code+"</a></h3>", "text/html;charset=UTF-8");
			//3.发送激活邮件
			Transport.send(message);
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}

}

(6)注册页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>用户注册页面</title>
<style type="text/css">
		body{
			font:14px/28px "微软雅黑";
		}
		.contact *:focus{outline :none;}
		.contact{
			width: 700px;
			height: auto;
			background: #f6f6f6;
			margin: 40px auto;
			padding: 10px;
		}
		.contact ul {
			width: 650px;
			margin: 0 auto;
		}
		.contact ul li{
			border-bottom: 1px solid #dfdfdf;
			list-style: none;
			padding: 12px;
		}
		.contact ul li label {
			width: 120px;
			display: inline-block;
			float: left;
		}
		.contact ul li input[type=text],.contact ul li input[type=password]{
			width: 220px;
			height: 25px;
			border :1px solid #aaa;
			padding: 3px 8px;
			border-radius: 5px;
		}
		.contact ul li input:focus{
			border-color: #c00;
			
		}
		.contact ul li input[type=text]{
			transition: padding .25s;
			-o-transition: padding  .25s;
			-moz-transition: padding  .25s;
			-webkit-transition: padding  .25s;
		}
		.contact ul li input[type=password]{
			transition: padding  .25s;
			-o-transition: padding  .25s;
			-moz-transition: padding  .25s;
			-webkit-transition: padding  .25s;
		}
		.contact ul li input:focus{
			padding-right: 70px;
		}
		.btn{
			position: relative;
			left: 300px;
		}
		.tips{
			color: rgba(0, 0, 0, 0.5);
			padding-left: 10px;
		}
		.tips_true,.tips_false{
			padding-left: 10px;
		}
		.tips_true{
			color: green;
		}
		.tips_false{
			color: red;
		}
  </style>
</head>
<body>

  
  <script type="text/javascript">
  		//验证用户名
	    function checkna(){
			na=form1.yourname.value;
		  	if( na.length <1 || na.length>12)  
	  		{  	
	  			divname.innerHTML='<font class="tips_false">长度是1~12个字符</font>';
	  		     
	  		}else{  
	  		    divname.innerHTML='<font class="tips_true">输入正确</font>';
	  		   
	  		}  
	    }
  		
	  //验证用户名
	    function checknickname(){
			na=form1.nickname.value;
		  	if( na.length <1 || na.length>12)  
	  		{  	
	  			divname.innerHTML='<font class="tips_false">长度是1~12个字符</font>';
	  		     
	  		}else{  
	  		    divname.innerHTML='<font class="tips_true">输入正确</font>';
	  		   
	  		}  
	    }
  		
	    //验证密码 
		function checkpsd1(){    
			psd1=form1.yourpass.value;  
			var flagZM=false ;
			var flagSZ=false ; 
			var flagQT=false ;
			if(psd1.length<6 || psd1.length>12){   
				divpassword1.innerHTML='<font class="tips_false">长度错误</font>';
			}else
				{   
				  for(i=0;i < psd1.length;i++)   
					{    
						if((psd1.charAt(i) >= 'A' && psd1.charAt(i)<='Z') || (psd1.charAt(i)>='a' && psd1.charAt(i)<='z')) 
						{   
							flagZM=true;
						}
						else if(psd1.charAt(i)>='0' && psd1.charAt(i)<='9')    
						{ 
							flagSZ=true;
						}else    
						{ 
							flagQT=true;
						}   
					}   
					if(!flagZM||!flagSZ||flagQT){
					divpassword1.innerHTML='<font class="tips_false">密码必须是字母数字的组合</font>'; 
					 
					}else{
						
					divpassword1.innerHTML='<font class="tips_true">输入正确</font>';
					 
					}  
				 
				}	
		}
		//验证确认密码 
		function checkpsd2(){ 
				if(form1.yourpass.value!=form1.yourpass2.value) { 
				     divpassword2.innerHTML='<font class="tips_false">您两次输入的密码不一样</font>';
				} else { 
				     divpassword2.innerHTML='<font class="tips_true">输入正确</font>';
				}
		}
		//验证邮箱
		
		function checkmail(){
					apos=form1.youremail.value.indexOf("@");
					dotpos=form1.youremail.value.lastIndexOf(".");
					if (apos<1||dotpos-apos<2) 
					  {
					  	divmail.innerHTML='<font class="tips_false">输入错误</font>' ;
					  }
					else {
						divmail.innerHTML='<font class="tips_true">输入正确</font>' ;
					}
		}
  </script>

	<div class="contact" >
		<form name="form1" method="post" action="${pageContext.request.contextPath }/RegistServlet">
			<ul>
				<li>
					<label>姓名:</label>
					<input type="text" name="yourname" placeholder="请输入用户名"  onblur="checkna()" required/><span class="tips" id="divname">长度1~12个字符</span>
				</li>
				<li>
					<label>密码:</label>
					<input type="password" name="yourpass" placeholder="请输入你的密码" onBlur="checkpsd1()" required/><span class="tips" id="divpassword1">密码必须由字母和数字组成</span>
				</li>
				<li>
					<label>确认密码:</label>
					<input type="password" name="yourpass2" placeholder="请再次输入你的密码" onBlur="checkpsd2()" required/><span class="tips" id="divpassword2">两次密码需要相同</span>
				</li>
				<li>
					<label>昵称:</label>
					<input type="text" name="nickname" placeholder="请输入昵称"  onblur="checknickname()" required/><span class="tips" id="divname">长度1~12个字符</span>
				</li>
				<li>
					<label>电子邮箱:</label>
					<input type="text" name="youremail" placeholder="请输入你的邮箱" onBlur="checkmail()" required/><span class="tips" id="divmail"></span>
				</li>
			</ul>
			<b class="btn"><input type="submit" value="提交"/>
			<input type="reset" value="取消"/></b>
		</form>
	</div>
</body>
</body>
</html>

三.启动项目

浏览器访问http://localhost:8080/JavaMail/regist.jsp

输入信息进行提交

查看邮箱,点击“收取”可以看到一封新邮件:


查看数据库(state为0,表示未激活)


然后点击激活链接地址

再查看数据库(state为1,表示已激活)


附:

源码地址https://github.com/Jasper2s/Study_Imooc/tree/master/JavaMail




猜你喜欢

转载自blog.csdn.net/qq_20788055/article/details/80792152