javaWeb实现给QQ邮箱发邮件(二)

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

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 = "[email protected]";
	// 发件人邮箱密码(有的是授权码)
	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地址验证
"+ "这封邮件是由XXX购物商城发送的。
"+ "你收到这封邮件是XXX购物商城进行新用户注册或者用户修改Email使用这个地址。
"+ "账号激活声明
"+ "你只将下面验证码输入提示框即可:

" + code + "


"; 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"%>




登录注册界面





请先完成邮箱验证
用户名:
密 码:
邮箱:
验证码:

五、创建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邮箱发邮件(二)_第2张图片javaWeb实现给QQ邮箱发邮件(二)_第3张图片

javaWeb实现给QQ邮箱发邮件(二)_第4张图片

失败测试:

javaWeb实现给QQ邮箱发邮件(二)_第5张图片

显示:

javaWeb实现给QQ邮箱发邮件(二)_第6张图片

显示:

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

网易邮箱测试:

javaWeb实现给QQ邮箱发邮件(二)_第7张图片

javaWeb实现给QQ邮箱发邮件(二)_第8张图片

--------------------------------------------------------------------------------------------------------------------------------------------

补充:

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

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

javaWeb实现给QQ邮箱发邮件(二)_第9张图片

 

javaWeb实现给QQ邮箱发邮件(二)_第10张图片

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

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

javaWeb实现给QQ邮箱发邮件(二)_第11张图片

535错误:

javaWeb实现给QQ邮箱发邮件(二)_第12张图片

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

-------------------------------------------------------------------------------------------------

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

---------------------------------------------------------------------------------------------------

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

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

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

源码地址:https://download.csdn.net/download/blackplus28/10865461

有积分想下载就下载,不想下载评论区留言或私信,我发你邮箱。

转载请声明出处:https://blog.csdn.net/BlackPlus28/article/details/85114001

 

你可能感兴趣的:(javaWeb)