JavaMail实现简单邮箱验证——163邮箱

最近的项目中遇到了这个问题,之前也并没有使用过JavaMail来实现邮箱验证,今天就来试一试。


需求:

当用户注册的时候,注册成功,向用户邮箱发送一个激活邮件,用户激活之后修改数据库中的状态,变为已激活。


当用户填写信息,点击注册的时候,入如果注册成功,则发送邮件。

JavaMail实现简单邮箱验证——163邮箱_第1张图片

@PostMapping(value="doRegister")
public @ResponseBody String doRegister(@Valid User user, BindingResult result) {
	// 检查合法性
	if (result.hasErrors()) {
		List list = result.getAllErrors();
		for (ObjectError error : list) {
			System.out.println(error.getDefaultMessage());
		}
		return "注册失败 " + list.get(0).getDefaultMessage();
	}
	// 调用服务
	if (userService.register(user)) {
		return "注册成功,请激活";
	} else {
		return "注册失败,请检查您的信息";
	}
}
获取表单数据之后,要对表单数据进行处理,调用UserService的register方法。

@Override
public boolean register(User user) {
	// 获取User
	String code = CodeUtils.generateUniqueCode();
	user.setCode(code);
	user.setState(0);
		
	if (userDao.existByUserName(user.getUsername())) return false;
		
	// 调用持久层保存数据,如果成功,发送一封邮件
	if(userDao.save(user)){
	   new Thread(new MailUtils(user.getEmail(), code)).start();;
	   return true;
	}
	return false;
}
如果持久层userDao调用save方法成功,则会启动一个线程,向用户邮箱发送一封邮件。


重点来了,使用JavaMail发送邮件:

public void run() {
  // 配置
  Properties prop=new Properties();
  // 设置邮件服务器主机名,这里是163
  prop.put("mail.host","smtp.163.com" );
  // 发送邮件协议名称
  prop.put("mail.transport.protocol", "smtp");
  // 是否认证
  prop.put("mail.smtp.auth", true);

  try {
    // SSL加密
    MailSSLSocketFactory sf = null;
    sf = new MailSSLSocketFactory();
    // 设置信任所有的主机
    sf.setTrustAllHosts(true);
    prop.put("mail.smtp.ssl.enable", "true");
    prop.put("mail.smtp.ssl.socketFactory", sf);

    // 创建会话对象
    Session session = Session.getDefaultInstance(prop, new Authenticator() {
      // 认证信息,需要提供"用户账号","授权码"
      public PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication("用户账号", "授权码");
      }
    });
    // 是否打印出debug信息
    session.setDebug(true);

    // 创建邮件
    Message message = new MimeMessage(session);
    // 邮件发送者
    message.setFrom(new InternetAddress("用户账号"));
    // 邮件接受者
    message.addRecipient(Message.RecipientType.TO, new InternetAddress(email));
    // 邮件主题
    message.setSubject("激活邮件");
    String content = "

请点击连接激活

http://localhost:8080/active?code=" + code + "

"; message.setContent(content, "text/html;charset=UTF-8"); // Transport.send(message); // 邮件发送 Transport transport = session.getTransport(); transport.connect(); transport.sendMessage(message, message.getAllRecipients()); transport.close(); } catch (Exception e) { e.printStackTrace(); } }
这里需要注意的就是授权码和邮件服务器主机名的获取。我们知道,邮件发送流程如下:

JavaMail实现简单邮箱验证——163邮箱_第2张图片

一般的邮箱是不会打开smtp,需要我们手动打开。

打开163邮箱并登录:

找到设置->P0P3/SMTP/IMAP。

JavaMail实现简单邮箱验证——163邮箱_第3张图片

这里将POP3/SMTP服务器勾上,并且获取授权码即可。在下面我们可以看到SMTP服务器主机名。
将这两个信息填上去,就可以愉快的发送邮件了!!


源码:https://github.com/a60782885/JavaMail

你可能感兴趣的:(JAVA,Spring,Boot)