上篇写的实现基本上是一个工具类,并没封装成下图这样方式(梨视频注册界面),现在开始完善上篇的java邮箱激活验证功。
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>密 码:</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邮箱当做垃圾邮件了)
效果图:
失败测试:
显示:
显示:
显示的用户名就是刚注册的用户名。
网易邮箱测试:
--------------------------------------------------------------------------------------------------------------------------------------------
补充:
以上发送邮件的邮箱均为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邮箱激活验证成功。以上代码本人亲测好几次,均没问题,所以你如果有问题的话,看看环境。
赶紧去测试一下,成功的话,留言说一声。
-----------------------------------------------------------------------------------------------------------------------------------------
获取源码:
1、评论,我看到会通过邮件发送源码。但不保证及时性,我也在上班,有时很忙。
个人网站:www.ganshuo8.com 欢迎来访