DoraCMS email校验问题
最近DoraCMS新增了不少用户,却发现了一个问题。DoraCMS注册模块设计之初,并没有加入注册成功先验证邮箱的功能,个人觉得有点麻烦,普通用户没事也不会为不太关心的网站做激活,可能注册目的只是关心网站内容。为了减少用户操作,DoraCMS中这个邮箱验证被干掉了,早期的注册大概是这样一个流程:
1、注册信息填写
2、提交注册
3、根据提示到邮箱去点击激活链接
4、激活成功
5、可以正常登录网站了
DoraCMS的注册流程:
1、注册信息填写
2、提交注册
3、到登录页面登录
这里确实存在问题了,用户注册填写了邮箱,却没有进行邮箱校验,导致任意的邮箱都可以注册,于是出现了:
看这些短邮箱,一看就是假的。但是在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来发邮件,当邮件发送失败会返回错误码,这种情况是可以判断该邮箱不存在的,于是,我们根据返回的参数来判断是否可以进行注册,从源头上避免了乱用邮箱注册,如果邮箱是错误的:
就是这样了,如果存在就可以继续往下走咯,注册成功的同时也会顺便收到提醒邮件:
是不是比之前的处理方式好多呢?当然,再做一次邮件激活是再好不过了。如果你有更好的方法,记得留言哈!