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 (八) 插播:jQuery实施方案
Feb 23 Javascript
ASP.NET jQuery 实例17 通过使用jQuery validation插件校验ListBox
Feb 03 Javascript
浅谈Javascript事件模拟
Jun 27 Javascript
$.getJSON在IE下失效的原因分析及解决方法
Jun 16 Javascript
JS实现点击按钮后框架内载入不同网页的方法
May 05 Javascript
JavaScript仿商城实现图片广告轮播实例代码
Feb 06 Javascript
Angularjs中使用Filters详解
Mar 11 Javascript
jQuery实现响应鼠标事件的图片透明效果【附demo源码下载】
Jun 16 Javascript
three.js快速入门【推荐】
Jan 21 Javascript
angular 基于ng-messages的表单验证实例
May 04 Javascript
js原生代码实现轮播图的实例讲解
Jul 28 Javascript
详解给Vue2路由导航钩子和axios拦截器做个封装
Apr 10 Javascript
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/08/06 PHP
php mysql PDO 查询操作的实例详解
2017/09/23 PHP
laravel 实现上传图片到本地和前台访问示例
2019/10/21 PHP
基于PHP实现用户登录注册功能的详细教程
2020/08/04 PHP
jQuery中fadeIn、fadeOut、fadeTo的使用方法(图片显示与隐藏)
2013/05/08 Javascript
jquery动态加载js三种方法实例
2013/08/03 Javascript
JavaScript DOM 编程艺术(第2版)读书笔记(JavaScript的最佳实践)
2013/10/01 Javascript
JQuery页面的表格数据的增加与分页的实现
2013/12/10 Javascript
JS实现三级折叠菜单特效,其它级可自动收缩
2015/08/06 Javascript
AngularJS中$interval的用法详解
2016/02/02 Javascript
详解nodejs微信公众号开发——6.自定义菜单
2017/04/13 NodeJs
angularjs实现分页和搜索功能
2018/01/03 Javascript
关于axios不能使用Vue.use()浅析
2018/01/12 Javascript
JavaScript静态作用域和动态作用域实例详解
2019/06/17 Javascript
javascript写一个ajax自动拦截并下载数据代码实例
2019/09/07 Javascript
你可能从未使用过的11+个JavaScript特性(小结)
2020/01/08 Javascript
[14:00]DOTA2国际邀请赛史上最长大战 赛后专访B神
2013/08/10 DOTA
[55:32]2018DOTA2亚洲邀请赛 4.4 淘汰赛 EG vs LGD 第二场
2018/04/05 DOTA
[01:09:16]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第一场 1月25日
2021/03/11 DOTA
Windows下使Python2.x版本的解释器与3.x共存的方法
2015/10/25 Python
Python设计模式之观察者模式简单示例
2018/01/10 Python
Flask框架web开发之零基础入门
2018/12/10 Python
Python学习笔记之函数的定义和作用域实例详解
2019/08/13 Python
在OpenCV里使用特征匹配和单映射变换的代码详解
2019/10/23 Python
Python守护进程实现过程详解
2020/02/10 Python
Python爬虫之App爬虫视频下载的实现
2020/12/08 Python
Python中lru_cache的使用和实现详解
2021/01/25 Python
美国家居装饰店:Pier 1
2019/09/04 全球购物
如果重写了对象的equals()方法,需要考虑什么
2014/11/02 面试题
护理毕业生自荐信范文
2013/12/22 职场文书
服务质量承诺书
2014/03/27 职场文书
《回乡偶书》教学反思
2014/04/12 职场文书
2014年最新学校运动会广播稿
2014/09/17 职场文书
无房产证房屋转让协议书合同样本
2014/10/18 职场文书
一年级数学下册复习计划
2015/01/17 职场文书
2019数学教师下学期工作总结
2019/06/27 职场文书