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

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


需求:

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


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


@PostMapping(value="doRegister")
public @ResponseBody String doRegister(@Valid User user, BindingResult result) {
	// 检查合法性
	if (result.hasErrors()) {
		List<ObjectError> 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 = "<html><head></head><body><h1>请点击连接激活</h1><h3><a href='http://localhost:8080/active?code="
        + code + "'>http://localhost:8080/active?code=" + code + "</href></h3></body></html>";
    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();
  }
}
这里需要注意的就是授权码和邮件服务器主机名的获取。我们知道,邮件发送流程如下:


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

打开163邮箱并登录:

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


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


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

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值