一.软件安装及资源准备
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