Node.js实现注册邮箱激活功能的方法示例


Posted in Javascript onMarch 23, 2018

在做自己的node项目极客教程时,需要开发一个注册邮箱激活的功能,这个功能非常常见,当我们注册一个账号时,肯定会有这步,下面看下如何实现这个功能。

1. 注册邮箱

先注册一个支持发送验证邮件的邮箱,我这里注册的是网易的163邮箱,所以下面都是以163邮箱作为发件邮箱

注册成功后进行登录,然后点击导航栏的设置,选择POP3/SMTP/IMAP,开启POP3/SMTP/IMAP服务,设置授权码就可以了。

2. 下载nodemailer插件

在命令行输入:npm install --save nodemailer

3. 编写发送邮件代码

3.1 对发送激活邮件代码进行封装,然后导出:

//email.js

// 引入 nodemailer
const nodemailer = require('nodemailer');

// 创建一个SMTP客户端配置
const config = {
    host: 'smtp.163.com',
    port: 465,
    auth: {
      user: 'xxxx@163.com', //刚才注册的邮箱账号
      pass: 'xxxxxx' //邮箱的授权码,不是注册时的密码
    }
  };

// 创建一个SMTP客户端对象
const transporter = nodemailer.createTransport(config);

// 发送邮件
module.exports = function (mail){
  transporter.sendMail(mail, function(error, info){
    if(error) {
      return console.log(error);
    }
    console.log('mail sent:', info.response);
  });
};

3.2 进行测试:

//sendtest.js

var send = require('./email.js');


// 创建一个邮件对象
var mail = {
  // 发件人
  from: '极客教程 <xxxx@163.com>',
  // 主题
  subject: '[极客教程]激活邮箱账号',
  // 收件人
  to: 'xxxx@qq.com',
  // 邮件内容,HTML格式
  text: `尊敬的${user.name},您好!点击链接即可激活您的极客教程
      网账号,http://localhost:3000/checkCode?name=${user.name}&code=${user.code}为保障您的帐号安全,请在24小时内点击该链接,您也可以将链接复制到浏览器地址栏访问。 若如果您并未尝试修改密码,请忽略本邮件,由此给您带来的不便请谅解。本邮件由系统自动发出,请勿直接回复!` //接收激活请求的链接
};
send(mail);

成功就可以在测试的邮箱看到所发的信息。

Node.js实现注册邮箱激活功能的方法示例

4. 验证步骤

简单的讲一下如何实现邮箱验证。

1 . 在自己定义的数据库用户数据结构中一定要有激活码、过期时间、是否已经激活的字段,用于在激活时进行判断;

{
  code: String, //激活码,格式自己定义
  date: Number, //过期日期,过期后不能激活
  islive: Boolean //判断是否激活
}

2 . 发送激活链接,其中包含用户名和激活码,如下面这样:

// 创建一个邮件对象
var mail = {
  // 发件人
  from: '极客教程 <xxxx@163.com>',
  // 主题
  subject: '[极客教程]激活邮箱账号',
  // 收件人
  to: 'xxxx@qq.com',
  // 邮件内容,HTML格式
  text: `尊敬的${user.name},您好!点击链接即可激活您的极客教程
      网账号,http://localhost:3000/checkCode?name=${user.name}&code=${user.code}为保障您的帐号安全,请在24小时内点击该链接,您也可以将链接复制到浏览器地址栏访问。 若如果您并未尝试修改密码,请忽略本邮件,由此给您带来的不便请谅解。本邮件由系统自动发出,请勿直接回复!` //接收激活请求的链接
};
send(mail);

3 . 响应激活请求,根据激活链接的用户名进行查找,若用户存在则判断激活码是否一致,并判断激活码是否过期,全部正确则改变激活状态,此时激活成功,如下代码:

// check email code
exports.checkCode = function (req, res){
  var username = req.query.name;
  var code = req.query.code;
  User.findOne({name: username}, function (err, user){
      if (user.code === code && (user.date - Date.now()) > 0){
          User.update({name: username}, {islive: true}, function (err){
              if (err){
                  res.json({error: true})
              }else{
                  console.log(user)
                  res.json({ok: true})
              }
          });
      }else{
        res.json({
          email: user.mail,
          failure: true
        })
      }
  });
}

5. 遇到的问题

开发中遇到如下问题:

{ [AuthError: Invalid login - 535 Error: authentication failed]
name: ‘AuthError',
data: ‘535 Error: authentication failed',
stage: ‘auth' }

smtp服务器验证不通过,因为网易的邮箱有个授权限制,一定要好好检查你注册邮箱时的账号和授权码。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于jQuery UI CSS Framework开发Widget的经验
Aug 21 Javascript
jquery插件实现鼠标经过图片右侧显示大图的效果(类似淘宝)
Feb 04 Javascript
JavaScript中使用arguments获得函数传参个数实例
Aug 27 Javascript
使用jQuery和Bootstrap实现多层、自适应模态窗口
Dec 22 Javascript
Validform+layer实现漂亮的表单验证特效
Jan 17 Javascript
jQuery leonaScroll 1.1 自定义滚动条插件(推荐)
Sep 17 Javascript
利用vue-router实现二级菜单内容转换
Nov 30 Javascript
Bootstrap基本插件学习笔记之Popover提示框(19)
Dec 08 Javascript
Vue cli3 库模式搭建组件库并发布到 npm的流程
Oct 12 Javascript
利用layer实现表单完美验证的方法
Sep 26 Javascript
vue实现短信验证码输入框
Apr 17 Javascript
Vue3如何理解ref toRef和toRefs的区别
Feb 18 Vue.js
Angular学习笔记之集成三方UI框架、控件的示例
Mar 23 #Javascript
Vue自定义过滤器格式化数字三位加一逗号实现代码
Mar 23 #Javascript
JavaScript 五大常见函数
Mar 23 #Javascript
JS中原始值和引用值的储存方式示例详解
Mar 23 #Javascript
剖析Angular Component的源码示例
Mar 23 #Javascript
vue利用axios来完成数据的交互
Mar 23 #Javascript
JS动画定时器知识总结
Mar 23 #Javascript
You might like
PHP图片自动裁切应付不同尺寸的显示
2014/10/16 PHP
Yii2中DropDownList简单用法示例
2016/07/18 PHP
php微信公众平台开发(一) 配置接口
2016/12/06 PHP
PHP给源代码加密的几种方法汇总(推荐)
2018/02/06 PHP
优化网页之快速的呈现我们的网页
2007/06/29 Javascript
javascript类继承机制的原理分析
2009/09/12 Javascript
写出更好的JavaScript程序之undefined篇(中)
2009/11/23 Javascript
Javascript attachEvent传递参数的办法
2009/12/14 Javascript
理解Javascript_08_函数对象
2010/10/15 Javascript
js使下拉列表框可编辑不止是选择
2013/12/12 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件包装
2015/11/20 Javascript
jQuery中设置form表单中action值的实现方法
2016/05/25 Javascript
JavaScript实现焦点进入文本框内关闭输入法的核心代码
2017/09/20 Javascript
使用cookie绕过验证码登录的实现代码
2017/10/12 Javascript
为什么使用koa2搭建微信第三方公众平台的原因
2018/05/16 Javascript
微信小程序实现点赞、取消点赞功能
2018/11/02 Javascript
JavaScript中继承原理与用法实例入门
2020/05/09 Javascript
微信小程序canvas动态时钟
2020/10/22 Javascript
Python3计算三角形的面积代码
2017/12/18 Python
使用requests库制作Python爬虫
2018/03/25 Python
python调用c++传递数组的实例
2019/02/13 Python
Python Matplotlib 基于networkx画关系网络图
2019/07/10 Python
python fuzzywuzzy模块模糊字符串匹配详细用法
2019/08/29 Python
基于Django统计博客文章阅读量
2019/10/29 Python
大二学期个人自我评价
2014/01/13 职场文书
社区工作者思想汇报
2014/01/13 职场文书
平安校园建设方案
2014/05/02 职场文书
国际商务专业求职信
2014/07/15 职场文书
庆六一活动总结
2014/08/29 职场文书
永远跟党走演讲稿
2014/09/12 职场文书
2014年双拥工作总结
2014/11/21 职场文书
停车场管理制度范本
2015/08/05 职场文书
暑假开始了,你的暑假学习计划写好了吗?
2019/07/04 职场文书
浅谈Web Storage API的使用
2021/06/23 Javascript
Nginx反向代理学习实例教程
2021/10/24 Servers
MYSQL常用函数介绍
2022/05/05 MySQL