idea实现注册登录时使用QQ邮箱激活功能

首先建立数据库,我的数据库为:

CREATE TABLE user
(
  uid varchar(11) primary key , -- 账号
  type int default 1,            -- 类型, 1注册会员, 2广告方, 3管理员
  name varchar(50) ,             -- 昵称
  email varchar(50),            -- 邮箱
  password varchar(50),         -- 密码
  active char(1) default '0',        -- 激活状态
  coin int   default  1000             -- 金币
);

其次在utils中创建MySendMailThread.java文件,代码内容为:

package utils;
import java.security.GeneralSecurityException;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message.RecipientType;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import com.sun.mail.util.MailSSLSocketFactory;
import javaBean.User;

public class MySendMailThread extends Thread {
   private User user = null;
   public MySendMailThread(User user) {
      this.user = user;
   }
   @Override
   public void run() {
      // 跟smtp服务器建立一个连接
      Properties p = new Properties();
      // 设置邮件服务器主机名
      p.setProperty("mail.host", "smtp.qq.com");// 指定邮件服务器,默认端口 25
      // 发送服务器需要身份验证
      p.setProperty("mail.smtp.auth", "true");// 要采用指定用户名密码的方式去认证
      // 发送邮件协议名称
      p.setProperty("mail.transport.protocol", "smtp");
      // 开启SSL加密,否则会失败
      MailSSLSocketFactory sf = null;
      try {
         sf = new MailSSLSocketFactory();
      } catch (GeneralSecurityException e1) {
         e1.printStackTrace();
      }
      sf.setTrustAllHosts(true);
      p.put("mail.smtp.ssl.enable", "true");
      p.put("mail.smtp.ssl.socketFactory", sf);
      // 开启debug调试,以便在控制台查看
      // session.setDebug(true);也可以这样设置
      // p.setProperty("mail.debug", "true");
      // 创建session
      Session session = Session.getDefaultInstance(p, new Authenticator() {
         @Override
         protected PasswordAuthentication getPasswordAuthentication() {
            // 用户名可以用QQ账号也可以用邮箱的别名
            PasswordAuthentication pa = new PasswordAuthentication(
                  "*********@qq.com", "**********");
            // new PasswordAuthentication中第一个为发邮件的自己的QQ号,第二个为授权码(需要到QQ邮箱中获取)
            return pa;
         }
      });
      session.setDebug(true);// 设置打开调试状态
      try {
         // 声明一个Message对象(代表一封邮件),从session中创建
         MimeMessage msg = new MimeMessage(session);
         // 邮件信息封装
         // 1发件人
         msg.setFrom(new InternetAddress("[email protected]"));
         // 2收件人
         msg.setRecipient(RecipientType.TO, new InternetAddress(user.getEmail()));
         // 3邮件内容:主题、内容
         msg.setSubject(user.getName() + ",欢迎注册综合类信息网站账号,请点击链接激活账号");
         // StringBuilder是线程不安全的,但是速度快,这里因为只会有这个线程来访问,所以可以用这个
         StringBuilder sbd = new StringBuilder();
         sbd.append(user.getName() + "<br/>欢迎!请确认此邮件地址以激活您的账号。<br/>");
         sbd.append("<font color='red'><a href='http://127.0.0.1:8080/ActiveServlet?uid="
               + user.getUid() + "' target='_blank'");
         sbd.append(">立即激活</a></font><br/>");
         sbd.append("或者点击下面链接:<br/>");
         sbd.append("http://127.0.0.1:8080/ActiveServlet?uid=" + user.getUid() + "<br/>");
         sbd.append("这是一封自动发送的邮件;如果您并未要求但收到这封信件,您不需要进行任何操作。");
         msg.setContent(sbd.toString(), "text/html;charset=utf-8");// 发html格式的文本
         // 发送动作
         Transport.send(msg);
         System.out.println("给" + user.getEmail() + "发送邮件成功。");
      } catch (AddressException e) {
         e.printStackTrace();
      } catch (MessagingException e) {
         e.printStackTrace();
      }
   }
}

在UserServices的注册方法中调用util工具类中的MySendMailThread.java中的方法,代码如下:

public boolean regist( User user ){
    new MySendMailThread( user ).run();
    return userDao.insert( user );
}

最后在登录中的UserLoginServlet.java文件中添加如下判断,通过查询数据库中的Active字段是否置1来判断用户是否登录邮箱进行邮箱激活,代码为:

if(user.getActive().equals("0")){
    String loginMsg="未使用邮箱激活账号,请打开您的邮箱激活!";
    request.setAttribute("loginMsg",loginMsg);
    request.getRequestDispatcher("/login.jsp").forward(request,response);
}

猜你喜欢

转载自blog.csdn.net/qq_40384579/article/details/86513437