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)
上一篇 2022年6月13日 下午8:00
下一篇 2022年6月13日 下午8:16


相关推荐

  • python程序的热部署实现[通俗易懂]

    python程序的热部署实现[通俗易懂]pytho程序的热部署知乎上面的回答真正意义上的代码热部署应该是类似erlang那样的,将代码更新到节点后不停服务,不断连接的自动应用新代码。autoreload(代表django的autoreload)什么的还是会造成业务瞬间中断。我感觉是可以从wsgi容器级别上实现,比如更新代码后检测到文件变更,然后通知容器创建新的wsgiapplication的实例,之后所有新的请求都发送到新的wdgi…

    2022年5月11日
    43
  • AWVS14.1.2使用教程(2021.3.6版本)

    AWVS14.1.2使用教程(2021.3.6版本)AWVS14 下载激活教程链接 https blog csdn net anlr2020 article details spm 1001 2014 3001 5502AWVS 简介 AWVS WebVulnerabi 是一个自动化的 Web 应用程序安全测试工具 它可以扫描任何可通过 Web 浏览器访问的和遵循 HTTP HTTPS 规则的 Web 站点和 Web 应用程序 适用于任何中小型和大型企业的内联网 外延网和面向客户 雇员 厂商和其它人员的 Web 网站 AWVS 可以

    2026年3月17日
    2
  • Mac下使用Anaconda在PyCharm配置PyTorch环境

    Mac下使用Anaconda在PyCharm配置PyTorch环境流程 1 安装 Anaconda2 在 Anaconda 下配置 PyTorch3 在步骤 2 之后配置 PyCharm1 安装 Anaconda 进去 Anaconda 官网 第一张图的界面 点击 Products 之后点击 IndividualEd 之后进入新的页面 在新的页面下滑最后会出现第二张图 点击红框的链接进行下载 安装的时候会有个安装位置选择 本人选择的 HD 磁盘下的用户 之后一步步安装完成 安装完成之后 打开终端 输入 conda 如果提示 zsh co

    2026年3月17日
    1
  • python字符串拼接

    python字符串拼接Python字符串拼接在Python的实际开发中,很多都需要用到字符串拼接,python中字符串拼接有很多,今天总结一下:用+符号拼接用%符号拼接用join()方法拼接用format()方法

    2022年7月5日
    25
  • 2025年主流大模型全景对比:Grok、Claude、ChatGPT与Gemini的战场 – 教程

    2025年主流大模型全景对比:Grok、Claude、ChatGPT与Gemini的战场 – 教程

    2026年3月15日
    3
  • Rancher部署报错状态一直restarting

    Rancher部署报错状态一直restarting

    2021年5月30日
    692

发表回复

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

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