最近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来发邮件,当邮件发送失败会返回错误码,这种情况是可以判断该邮箱不存在的,于是,我们根据返回的参数来判断是否可以进行注册,从源头上避免了乱用邮箱注册,如果邮箱是错误的:

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

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