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

2022-07-01 19:22:42 浏览数 (1)

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

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

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

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

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

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

代码语言:javascript复制
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模块(就是邮件内容)

代码语言:javascript复制
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类(生成随机码)

代码语言:javascript复制
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,文件放到源码中,自行获取。)

代码语言:javascript复制
<%@ 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类

代码语言:javascript复制
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类

代码语言:javascript复制
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邮箱当做垃圾邮件了)

效果图:

失败测试:

显示:

显示:

显示的用户名就是刚注册的用户名。

网易邮箱测试:

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

补充:

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

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

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

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

535错误:

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

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

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

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

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

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

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

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

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

0 人点赞