最近DoraCMS新增了不少用户,却发现了一个问题。DoraCMS注册模块设计之初,并没有加入注册成功先验证邮箱的功能,个人觉得有点麻烦,普通用户没事也不会为不太关心的网站做激活,可能注册目的只是关心网站内容。为了减少用户操作,DoraCMS中这个邮箱验证被干掉了,早期的注册大概是这样一个流程:

1、注册信息填写

2、提交注册

3、根据提示到邮箱去点击激活链接

4、激活成功

5、可以正常登录网站了


DoraCMS的注册流程:

1、注册信息填写

2、提交注册

3、到登录页面登录


这里确实存在问题了,用户注册填写了邮箱,却没有进行邮箱校验,导致任意的邮箱都可以注册,于是出现了:

DoraCMS邮箱校验.jpg


看这些短邮箱,一看就是假的。但是在DoraCMS中,邮箱其实是有作用的,目前在留言模块用户回复是用到邮件提醒的,如果邮箱是错误了,就没多大意义了,怎样让用户在注册时填一个真实的邮箱呢?我找了一个聚合的api,貌似可以用,大概是这么描述的:


接口地址:http://v.juhe.cn/verifyemail/query

支持格式:json/xml

请求方式:http get

请求示例:http://v.juhe.cn/verifyemail/query?key=您申请的KEY&email=info@mail.juhe.cn

接口备注:通过连接到邮件服务器并检查邮箱存在与否。


问题是,它的要钱的,要出钱的事,生哥是不会干的,于是想了一下,把注册部分的代码改造了一下:

修改路由中的user.js,用户提交注册这样写:

// 用户注册
    router.post('/doReg', function(req, res, next) {
        var errors;
        var userName = req.body.userName;
        var email = req.body.email;
        var password = req.body.password;
        var confirmPsd = req.body.confirmPassword;
//    数据校验
        if(!validator.isUserName(userName)){
            errors = "用户名5-12个英文数字组合";
        }
        if(!validator.isPsd(password) || !validator.isLength(password,6,12)){
            errors = "6-12位,只能包含字母、数字和下划线";
        }
        if(password !== confirmPsd)
        {
            errors = "密码不匹配,请重新输入";
        }
        if(!validator.isEmail(email)){
            errors = "请填写正确的邮箱地址";
        }
        if(errors){
            res.end(errors);
        }else{
            var regMsg = {
                email : email,
                userName : userName
            };
            system.sendEmail(settings.email_notice_user_reg,regMsg,function(err){
                if(err && err == 'notCurrentEmail'){
                    res.end('乱写邮箱被我发现了吧!');
                }else{
                    //        邮箱和用户名都必须唯一
                    var query=User.find().or([{'email' : email},{userName : userName}]);
                    query.exec(function(err,user){
                        if(user.length > 0){
                            errors = "邮箱或用户名已存在!";
                            res.end(errors);
                        }else{
                            var newPsd = DbOpt.encrypt(password,settings.encrypt_key);
                            req.body.password = newPsd;
                            //发送系统消息给管理员
                            siteFunc.sendSystemNoticeByType(req,res,'reg',userName);

                            DbOpt.addOne(User,req, res)
                        }
                    });
                }

            });
        }
    });


先根据用户填写的邮箱发个邮件过去,因为DoraCMS用的nodemailer来发邮件,当邮件发送失败会返回错误码,这种情况是可以判断该邮箱不存在的,于是,我们根据返回的参数来判断是否可以进行注册,从源头上避免了乱用邮箱注册,如果邮箱是错误的:

QQ截图20151128165158.jpg


就是这样了,如果存在就可以继续往下走咯,注册成功的同时也会顺便收到提醒邮件:

DoraCMS注册提醒.jpg

是不是比之前的处理方式好多呢?当然,再做一次邮件激活是再好不过了。如果你有更好的方法,记得留言哈!