javaWeb实现qq邮箱验证(二)「建议收藏」

javaWeb实现qq邮箱验证(二)「建议收藏」上篇写的实现基本上是一个工具类,并没封装成下图这样方式(梨视频注册界面),现在开始完善上篇的java邮箱激活验证功。java邮箱验证地址:https://blog.csdn.net/BlackPlus28/article/details/85044068———————————————————————…

大家好,又见面了,我是你们的朋友全栈君。

上篇写的实现基本上是一个工具类,并没封装成下图这样方式(梨视频注册界面),现在开始完善上篇的java邮箱激活验证功。
javaWeb实现qq邮箱验证(二)「建议收藏」

java邮箱验证地址:https://blog.csdn.net/BlackPlus28/article/details/85044068

——————————————————————————————————————-

上篇已经实现发送邮件这个功能,现在我把它写成util类。

一、创建JavaMailUtil类(下面的代码是之前写的Test类中的代码,直接复制过来即可)

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Date;
import java.util.UUID;

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

public class JavaMailUtil {

	// 发件人的邮箱和密码
	public static String emailAccount = "XXXXXXXXX@qq.com";
	// 发件人邮箱密码(有的是授权码)
	public static String emailPassword = "XXXXXXXXXX";
	// 发件人邮箱服务地址
	public static String emailSMTPHost = "smtp.qq.com";
	//  收件人邮箱
	public static String receiveMailAccount = "";
	/**
	 *  创建一封邮件(发件人、收件人、邮件内容)
	 * @param session
	 * @param sendMail
	 * @param receiveMail
	 * @param html
	 * @return
	 * @throws MessagingException
	 * @throws IOException 
	 * cc:抄送
	 * Bcc:密送
	 * To:发送
	 */
	public static  MimeMessage creatMimeMessage(Session session,String sendMail,String receiveMail,String html) throws MessagingException, IOException {
		// 1、创建一封邮件对象
		MimeMessage message = new MimeMessage(session);
		// 2、From:发件人
		message.setFrom(new InternetAddress(sendMail, "发件人昵称", "UTF-8"));
		// 3、To:收件人(可以增加多个收件人:抄送或者密送)
		message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, "张三", "UTF-8"));
		// 4、Subject:邮件主题
		message.setSubject("邮箱验证","UTF-8");
		// 5、Content:邮件正文(可以使用Html标签)
		message.setContent(html,"text/html;charset=UTF-8");
		// 6、设置发送时间
		message.setSentDate(new Date());
		// 7、保存设置
		message.saveChanges();
		// 8、将该邮件保存在本地
		OutputStream out = new FileOutputStream("D://MyEmail" + UUID.randomUUID().toString() + ".eml");
		message.writeTo(out);
		out.flush();
		out.close();
		return message;
	} 
}

二、创建一个Html模块(就是邮件内容)

public class htmlText {
	//  返回页面Html携带的6位随机码
	public static String html(String code) {
		
		String html = "Email地址验证<br/>"+ 
		"这封邮件是由XXX购物商城发送的。<br/>"+
		"你收到这封邮件是XXX购物商城进行新用户注册或者用户修改Email使用这个地址。<br/>"+
		"账号激活声明<br/>"+
		"你只将下面验证码输入提示框即可:<h3 style='color:red;'>" + code + "</h3><br/>";
		return html;
	}
}

三、创建RandomUtil类(生成随机码)

public class RandomUtil {
	public static void main(String[] args) {
		// 控制台打印
		System.out.println(RandomUtil.getRandom());
	}
	//  获取6为随机验证码
	public static String getRandom() {
		String[] letters = new String[] {
				"q","w","e","r","t","y","u","i","o","p","a","s","d","f","g","h","j","k","l","z","x","c","v","b","n","m",
				"A","W","E","R","T","Y","U","I","O","P","A","S","D","F","G","H","J","K","L","Z","X","C","V","B","N","M",
				"0","1","2","3","4","5","6","7","8","9"};
		String code ="";
		for (int i = 0; i < 6; i++) {
			code = code + letters[(int)Math.floor(Math.random()*letters.length)];
		}
		return code;
	}
}

四、创建register.jsp页面(这里只是测试功能,需要样式的自行添加,用到了一点点JQuery,文件放到源码中,自行获取。)

<%@ 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=utf-8">
<title>登录注册界面</title>
<style type="text/css">
.table tr {
   border-collapse: collapse;
}
</style>
<script type="text/javascript" src="js/jquery-1.8.0.min.js"></script>
<script type="text/javascript">

$(function(){
	$("#btn").click(function(){
		if($(".email").val()){
					$.ajax({
						type:"POST",
						url :"SendEmailServlet?random"+Math.random(),
						data:{
							email:$(".email").val(),
						},
						success:function(data){
							alert("success");
						},
					})
		}else{
			alert("fail");
			$("#notice").html("请填写邮箱");
			setTimeout(function(){
				$("#notice").hide();
			},1000);
		}
	});
	//  判断用户是否可以注册
	$("#submit").click(function(){
		if($(".email").val()){
			$("#RegistForm").submit();
		}else{   //  如果没有值
			$("#notice").html("请完整信息");
			setTimeout(function(){
				$("#notice").hide();
			},1000);
		}
	});
});
</script>
</head>
<body>
<form action="${pageContext.request.contextPath}/RegistServlet" id="RegistForm"    method="post">
	<table width="300" border="1" class="table" >
		<tr>
			<td>用户名:</td>
			<td><input type="text" name="username"></td>
		</tr>
		<tr>
			<td>密&nbsp;码:</td>
			<td><input type="password" name="password"></td>
		</tr>
		<tr>
			<td>邮箱:</td>
			<td><input type="text" name="email" class="email"></td>
			<td>
				<input type="button" class="btn" id="btn" value="发送邮箱验证码"/><br/>
			</td>
		</tr>
		<tr>
			<td>验证码:</td>
			<td><input type="text" name="code" class="code"></td>
		</tr>
		<span id="notice" class="hide">请先完成邮箱验证</span><br/>
		<tr>
			<td colspan="2"><input type="submit" id="submit" value="注册"></td>
		</tr>
	</table>
 </form>
</body>
</html>

五、创建fail.jsp和success.jsp 。代码就不贴了,里面只有一句话,测试用,需要的,源码中自行获取。

六、创建SendEmailServlet类

import com.itshenjin.html.htmlText;
import com.itshenjin.util.JavaMailUtil;
import com.itshenjin.util.RandomUtil;

import java.io.IOException;
import java.util.Properties;

import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.MimeMessage;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 * 发送邮件 功能:
 * 
 * @author itshenjin
 * @author 2018年12月10日
 *
 */
@WebServlet("/SendEmailServlet")
public class SendEmailServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		try {
			String email = req.getParameter("email");
			JavaMailUtil.receiveMailAccount = email; // 给用户输入的邮箱发送邮件

			// 1、创建参数配置,用于连接邮箱服务器的参数配置
			Properties props = new Properties();
			// 开启debug调试
			props.setProperty("mail.debug", "true");
			// 发送服务器需要身份验证
			props.setProperty("mail.smtp.auth", "true");
			// 设置右键服务器的主机名
			props.setProperty("mail.host", JavaMailUtil.emailSMTPHost);
			// 发送邮件协议名称
			props.setProperty("mail.transport.protocol", "smtp");

			// 2、根据配置创建会话对象,用于和邮件服务器交互
			Session session = Session.getInstance(props);
			// 设置debug,可以查看详细的发送log
			session.setDebug(true);
			// 3、创建一封邮件
			String code = RandomUtil.getRandom();
			System.out.println("邮箱验证码:" + code);
			String html = htmlText.html(code);
			MimeMessage message = JavaMailUtil.creatMimeMessage(session, JavaMailUtil.emailAccount,
					JavaMailUtil.receiveMailAccount, html);

			// 4、根据session获取邮件传输对象
			Transport transport = session.getTransport();
			// 5、使用邮箱账号和密码连接邮箱服务器emailAccount必须与message中的发件人邮箱一致,否则报错
			transport.connect(JavaMailUtil.emailAccount, JavaMailUtil.emailPassword);
			// 6、发送邮件,发送所有收件人地址
			transport.sendMessage(message, message.getAllRecipients());
			// 7、关闭连接
			transport.close();
			//  写入session
			req.getSession().setAttribute("code", code);
		} catch (Exception e) {
			e.printStackTrace();
			req.getSession().setAttribute("error", "邮件发送失败");
		}
	}
}

七、创建RegistServlet类


import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 
 * 功能:发送邮箱功能处理
 * @author itshenjin
 * @author 2018年12月11日
 *
 */
@WebServlet("/RegistServlet")
public class RegistServlet extends HttpServlet{
	private static final long serialVersionUID = 1L;
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String sessionCode = (String) req.getSession().getAttribute("code");
		System.out.println(sessionCode);
		//  获取session中的验证码
		if(sessionCode != null) {
			//  获取页面提交的验证码
			String inputCode = req.getParameter("code");
			System.out.println("页面提交的验证码:" + inputCode);
			if (sessionCode.toLowerCase().equals(inputCode.toLowerCase())) {
				// 把用户名和密码等一系列信息插入到数据库中,这块很简单的逻辑,暂时没写,后续更新上
				String username = req.getParameter("username");
				String password = req.getParameter("password");
				
				//  验证成功,跳转成功页面
				req.setAttribute("username", username);
				req.getRequestDispatcher("/success.jsp").forward(req, resp);
			}else {
				//  验证失败
				req.getRequestDispatcher("fail.jsp").forward(req, resp);
			}
		}else {
			//  验证失败
			req.getRequestDispatcher("fail.jsp").forward(req, resp);
		}
		//  移除session中的验证码
		req.removeAttribute("code");
	}
}

到这里就写完了,看以下截图。(注:邮箱找不见,就去垃圾箱找,我今天测试了好多次,所以被qq邮箱当做垃圾邮件了

效果图:

javaWeb实现qq邮箱验证(二)「建议收藏」javaWeb实现qq邮箱验证(二)「建议收藏」

javaWeb实现qq邮箱验证(二)「建议收藏」

失败测试:

javaWeb实现qq邮箱验证(二)「建议收藏」

显示:

javaWeb实现qq邮箱验证(二)「建议收藏」

javaWeb实现qq邮箱验证(二)「建议收藏」

显示:

javaWeb实现qq邮箱验证(二)「建议收藏」            显示的用户名就是刚注册的用户名。

网易邮箱测试:

javaWeb实现qq邮箱验证(二)「建议收藏」

javaWeb实现qq邮箱验证(二)「建议收藏」

——————————————————————————————————————————————–

补充:

以上发送邮件的邮箱均为qq邮箱,收件人是任意邮箱类型(上面测试qq邮箱和网易邮箱)。现在我把发件人换成网易邮箱,会报如下554、535错误:
 

javaWeb实现qq邮箱验证(二)「建议收藏」

是什么问题导致的呢? 测试一下,修改如下代码:

javaWeb实现qq邮箱验证(二)「建议收藏」

 

javaWeb实现qq邮箱验证(二)「建议收藏」

原因分析:就是说被当做垃圾或者病毒处理了,你肯定想问我就发几个字而已,但事实就是被当做垃圾或者病毒邮件了,看报错信息可知。

网易邮箱截图(更多错误:http://help.163.com/09/1224/17/5RAJ4LMH00753VB8.html):

javaWeb实现qq邮箱验证(二)「建议收藏」

535错误:

javaWeb实现qq邮箱验证(二)「建议收藏」

错误原因:授权码或者邮箱错误导致的。可以参考这个博客:https://blog.csdn.net/weixin_38465623/article/details/80789793

————————————————————————————————-

补充:535错误:用qq或者网易邮箱过多的发送邮件也会导致这个错误。

—————————————————————————————————

说到这里还是用qq测试,对初学者友好点,有时候代码没问题,因为其他问题(比如554错误),但是初学者不知道问题所在,代码bug找半天,也不知道错在哪里,反而学起来没信心。你可以先用我的代码先运行起来,成功之后,再增加其他一些操作(插入数据库等等)。

到这里测试全部完成,java邮箱激活验证成功。以上代码本人亲测好几次,均没问题,所以你如果有问题的话,看看环境。

赶紧去测试一下,成功的话,留言说一声。

 

 

—————————————————————————————————————————————–

 

获取源码:

1、评论,我看到会通过邮件发送源码。但不保证及时性,我也在上班,有时很忙。

个人网站:www.ganshuo8.com  欢迎来访

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/147211.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python+pycharm+selenium+谷歌浏览器驱动 自动化环境部署

    python+pycharm+selenium+谷歌浏览器驱动 自动化环境部署准备工作:  第一步:安装python。打开网址https://www.python.org/downloads/windows/现在最新版本3.7,本人使用的是3.6。  第二步:安装pycharm。打开网址:https://www.jetbrains.com/pycharm/download/#section=windows有开源版和试用版,开源即免费,试用版试用期过后要$$。安装试用版过程中它会弹出个注册界面,关于破解自行搜索。开源版则没有…

    2022年5月12日
    52
  • pycharm卸载再安装_pycharm双击无法打开

    pycharm卸载再安装_pycharm双击无法打开今个发现原来下载的2017版的pycharm过期了,用一会就闪退,emmm。就想下一个新的进行迭代,结果安装好并重启了,软件就是打不开…方法一1.打开C:\Windows\System32;以管理员身份运行cmd.exe;2.在打开的cmd窗口中,输入netshwinsockreset,按回车键;3.重启电脑;博主使用这个方法后,双击后还是不行。随即用了方法二,如下:方法二只需要打开C:\Users\admin后面的admin换成你自己的当前用户名(如下图),然后把所

    2022年8月29日
    3
  • C/C++指针详解之基础篇(史上最全最易懂指针学习指南!!!!)「建议收藏」

    C/C++指针详解之基础篇(史上最全最易懂指针学习指南!!!!)「建议收藏」目录一.变量的内存实质到1.1变量的实质1.2赋值给变量1.3变量在哪里?二.指针是个什么东西?三.二级指针(指针的指针)3.1定义与初始化3.2间接数据访问3.2.1.改变一级指针指向3.2.2改变N-1级指针的指向3.2.3二级指针的步长四.指针与数组4.1指针与数组名4.1.1通过数组名访问数组元素4….

    2022年5月22日
    38
  • 将图片存储到mysql数据库[通俗易懂]

    将图片存储到mysql数据库[通俗易懂]正常的图片储存要么放进本地磁盘,要么就存进数据库。存入本地很简单,现在我在这里记下如何将图片存进mysql数据库 如果要图片存进数据库 要将图片转化成二进制。1.数据库存储图片的字段类型要为blob二进制大对象类型2.将图片流转化为二进制下面放上代码实例一、数据库CREATETABLE`photo`(`id`int(11)NOTNULL,`na

    2022年7月12日
    22
  • qmake中文官方文档

    qmake中文官方文档qmakeQMake提供了一个用于管理应用程序,库,其他组件的构建过程的面向工程系统QMake扩展了每个工程文件的信息,生成一个执行编译和连接过程的Makefile本文翻译自Qt4.8官方文档。一、QMake使用QMake提供了一个用于管理应用程序、库、其它组件的构建过程的面向工程系统。QMake扩展了每个工程文件的信息,生成一个执行编译和链接过程的必须命令的MakeFile。1、描述工程工程文件.pro描述了工程信息。工程文件信息会被qmake用于生成包含构建过程中所需的所有命令的Mak

    2022年5月19日
    44
  • 最全Python学习路线图【2020最新版】

    最全Python学习路线图【2020最新版】2020年最新的python学习大纲,专为python高薪打造另外很多人在学习Python的过程中,往往因为没有好的教程或者没人指导从而导致自己容易放弃,为此我建了个Python交流.裙:一久武其而

    2022年7月5日
    26

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号