您的位置:首页 > 编程语言 > Java开发

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

2017-04-10 13:24 447 查看
最近的项目中遇到了这个问题,之前也并没有使用过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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  javamail 邮箱验证