继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Java APP移动端邮箱认证

简学Java
关注TA
已关注
手记 31
粉丝 7112
获赞 545
Java APP移动端邮箱认证

图片描述

前言:

要实现邮箱认证服务,大致分为以下四个步骤:搭建邮箱服务、制作一个发送邮件的工具类、后台实现一个供APP调用的接口API、邮箱认证的通知回调,当然这其中还涉及到邮件内容的设计和一个HTML/jsp页面,用来向用户显示认证结果。

一、邮箱服务的搭建。

在这里不展示SMTP邮箱服务的搭建,只介绍后台如何使用搭建。

1.如果项目是maven工程,在pom.xml文件中添加如下依赖。

<!-- 邮箱服务依赖包 -->
<dependency>
   <groupId>javax.mail</groupId>
   <artifactId>javax.mail-api</artifactId>
   <version>1.6.0</version>
</dependency>
<dependency>
   <groupId>com.sun.mail</groupId>
   <artifactId>javax.mail</artifactId>
   <version>1.6.0</version>
</dependency>

2.如果是web工程,在lib包添加jar文件。网盘地址:链接:链接描述 密码:1lfu

二、邮件发送工具类

SMTP的host主要有万网、163、126、阿里云,分别为:

  万网    smtp.mxhichina.com
    163     smtp.163.com
    126     smtp.126.com
    阿里云   smtp.aliyun.com
/**
 *
 * Copyright © 2017 Xunxin Network Technology Co. Ltd.
 *
 * @Author Noseparte
 * @Compile 2018年1月19日 -- 下午1:38:46
 * @Version 1.0
 * @Description         邮件工具类
 */
public class SendEmail { 

//   public static final String HOST = "smtp.aliyun.com";       //普通邮箱
   public static final String HOST = "smtp.qiye.aliyun.com";    //企业邮箱
   public static final String PROTOCOL = "smtp";                //协议类型
   public static final int PORT = 25;                           //端口号
   public static final int TIMELIMIT = 1000*60*60*24;           //激活邮件过期时间24小时
   public static final String FROM = "***********";        //发件人的email 
   public static final String PWD = "**********";                //发件人密码 

   /**
    * 获取Session
    * @return
    */ 
   private static Session getSession() { 
       Properties props = new Properties(); 
       props.put("mail.smtp.host", HOST);//设置服务器地址 
       props.put("mail.store.protocol" , PROTOCOL);//设置协议 
       props.put("mail.smtp.port", PORT);//设置端口 
       props.put("mail.smtp.auth" , true); 

       Authenticator authenticator = new Authenticator() { 

           @Override 
           protected PasswordAuthentication getPasswordAuthentication() { 
               return new PasswordAuthentication(FROM, PWD); 
           } 

       }; 
       Session session = Session.getDefaultInstance(props , authenticator); 

       return session; 
   } 

   public static void send(String toEmail , String content) { 
       Session session = getSession(); 
       try { 
           System.out.println("--send--"+content); 
           // Instantiate a message 
           Message msg = new MimeMessage(session); 

           //Set message attributes 
           msg.setFrom(new InternetAddress(FROM)); 
           InternetAddress[] address = {new InternetAddress(toEmail)}; 
           msg.setRecipients(Message.RecipientType.TO, address); 
           msg.setSubject("******邮箱认证");         //邮件标题  
           msg.setSentDate(new Date()); 
           msg.setContent(content , "text/html;charset=utf-8"); 

           //Send the message 
           Transport.send(msg); 
       } 
       catch (MessagingException mex) { 
           mex.printStackTrace(); 
       } 
   } 
}

三、邮件发送的API

  /**
    * 发送认证邮件
    *
    * @param phone
    * @param verifyCode
    * @return
    */
   @RequestMapping(value=Router.Personal.MAIL_AUTHENTICATION,method=RequestMethod.POST)
   @ResponseBody
   public Response mail_authentication(@RequestParam("userId") int userId,@RequestParam("email") String email,
                @RequestParam("authType") String authType) {
         log.info("InfoMsg:--- 发送认证邮件开始");
         Response response = this.getReponse();
         PageData pd = new PageData<>();
         try {
                PageData authPd = new PageData<>();
                pd.put("userId", userId);
                pd.put("authType", "cert");
                if(!userAuthenticationService.isAuthentication(authPd)) {
                       return response.failure("请先进行实名认证");
                }
             UserEntity user = appUserService.findById(userId);
             String ID = user.getID();
             String name = user.getName();
             pd.put("id", userId);
             pd.put("email", email);
             String text = JSON.toJSONString(pd);
        String URL = "http://www.xunxinkeji.cn/app-api/personal";;
        String token = SymmetricEncoder.AESEncode(KEY_STR,text.toString());
        String content = "<p>亲爱的"+name+",您好。<br><br>您于:"+ PeriodsUtil.getWholeTime(new Date()) +"通过帐号:"+ID+"申请了循心APP的邮箱认证,请点击如下链接完成认证."
                +"<br><a href='"+URL+"/activate_mail/?token="+token+"&email="+email+"'>"
                +URL+"/activate_mail/?token="+token+"&email="+email+"</a><br><br>(如果您无法点击此链接,请将其复制到浏览器地址栏后访问)<br>为了保障您帐号的安全性,请在24小时内完成认证,此链接将在认证后失效!</p>";
        SendEmail.send(email, content);

        UserAuthentication auth = new UserAuthentication(email, "mail", 1, "", "", new Date(), userId);
        userAuthenticationService.save(auth);
                log.info("InfoMsg:--- 发送认证邮件结束");
                return response.success();
         } catch (Exception e) {
                log.error("errorMsg:--- 发送认证邮件失败:" + e.getMessage());
                return response.failure(e.getMessage());
         }
   }

四、邮箱认证的回调通知

/**
        * 邮箱认证异步通知
        *
        * @param phone
        * @param verifyCode
        * @return
        */
       @RequestMapping(value=Router.Personal.ACTIVATE_MAIL,method=RequestMethod.GET)
       @ResponseBody
       public ModelAndView activate_mail(@RequestParam("email") String email,@RequestParam("token") String token) {
           log.info("InfoMsg:--- 邮箱激活认证开始");
           ModelAndView mv = this.getModelAndView();
           PageData pd = new PageData<>();
           String msg = "";
           try {
               if(StringUtils.trim(token).equals("") && StringUtils.isBlank(token)) {
                   return new ModelAndView("/error");
               }
               String jsonObj = SymmetricEncoder.AESDncode(KEY_STR,token);
               JSONObject obj = JSON.parseObject(jsonObj);
               int userId = Integer.parseInt(obj.getString("id"));
               UserEntity user = appUserService.findById(userId);
               UserAuthentication auth = userAuthenticationService.model(userId, "mail");
               if(null != auth) {
                   if((PeriodsUtil.addDate(auth.getAuthTime()) + 1000*60*60*24) < PeriodsUtil.addDate(new Date())) {
                       msg = "亲爱的用户,很抱歉,您的认证信息已超过有效期!";
                   }else {
                       msg = "亲爱的用户,恭喜您认证成功。";
                       appUserService.setEmail(userId,email);
                       PageData emailPd = new PageData<>();
                       emailPd.put("userId", userId);
                       emailPd.put("authType", "mail");
                       emailPd.put("authState", 2);
                       String authRemark = user.getNickName() + "于:" + PeriodsUtil.getWholeTime(new Date()) + "进行了实名认证.";
                       emailPd.put("authRemark", authRemark);
                       emailPd.put("authTime", new Date());
                       userAuthenticationService.update(emailPd);
                       //认证动态记录
                    UserDynamicRecordVO vo = new UserDynamicRecordVO(0, "", "我新增了邮箱认证。", DynamicConstants.AUTHENT_CHANGE, "", userId, 0);
                    userDynamicRecordService.save(vo);
                     //赠送积分
                    int userExp = user.getUserExp();
                    appUserService.user_exp_change(userId, userExp + 50);
                     //生成积分记录
                    UserExpChangeRecord record = new UserExpChangeRecord(ExpConstants.AUTHENTICATION, ExpConstants.INCOME, userExp, 50, userExp+50, userId);
                    userExpChangeRecordService.save(record);
                   }
               }
               pd.put("msg", msg);
               mv.addObject("pd", pd);
               mv.setViewName("jsp/platform/notice");
               log.info("InfoMsg:--- 邮箱激活认证结束");
               return mv;
           } catch (Exception e) {
               log.error("errorMsg:--- 邮箱激活认证失败:" + e.getMessage() + "---}");
               return new ModelAndView("/error");
           }
       }
打开App,阅读手记
4人推荐
发表评论
随时随地看视频慕课网APP