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 相关文章推荐
AutoSave/自动存储功能实现
Mar 24 Javascript
javascript在事件监听方面的兼容性小结
Apr 07 Javascript
IE6/7 and IE8/9/10(IE7模式)依次隐藏具有absolute或relative的父元素和子元素后再显示父元素
Jul 31 Javascript
js验证是否为数字的总结
Apr 14 Javascript
js将当前时间格式转换成时间搓(自写)
Sep 26 Javascript
jQuery替换字符串(实例代码)
Nov 13 Javascript
使用JS画图之点、线、面
Jan 12 Javascript
jQuery中Ajax的get、post等方法详解
Jan 20 Javascript
AngularJS 依赖注入详解及示例代码
Aug 17 Javascript
iView框架问题整理小结
Oct 16 Javascript
vue2.0 实现富文本编辑器功能
May 26 Javascript
原生js实现弹幕效果
Nov 29 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遍历文件目录与清除目录中文件的实现详解
2013/06/24 PHP
Ubuntu server 11.04安装memcache及php使用memcache来存储session的方法
2016/05/31 PHP
PHP实践教程之过滤、验证、转义与密码详解
2017/07/24 PHP
一端时间轮换的广告
2006/06/26 Javascript
JavaScript语句可以不以;结尾的烦恼
2007/03/08 Javascript
Mootools 1.2教程 Tooltips
2009/09/15 Javascript
js DOM的学习笔记
2011/12/22 Javascript
jQuery.getScript加载同域JS的代码
2012/02/13 Javascript
jQuery去掉字符串起始和结尾的空格(多种方法实现)
2013/04/01 Javascript
BootStrap 智能表单实战系列(二)BootStrap支持的类型简介
2016/06/13 Javascript
jQuery回到顶部的代码
2016/07/09 Javascript
js实现常用排序算法
2016/08/09 Javascript
jQuery实现扑克正反面翻牌效果
2017/03/10 Javascript
Bootstrap实现各种进度条样式详解
2017/04/13 Javascript
Nodejs读取文件时相对路径的正确写法(使用fs模块)
2017/04/27 NodeJs
详解微信小程序实现WebSocket心跳重连
2018/07/31 Javascript
React项目动态设置title标题的方法示例
2018/09/26 Javascript
vue组件间通信六种方式(总结篇)
2019/05/15 Javascript
node.js的http.createServer过程深入解析
2019/06/06 Javascript
JavaScript学习教程之cookie与webstorage
2019/06/23 Javascript
Vue中遍历数组的新方法实例详解
2019/07/21 Javascript
js实现简单点赞操作
2020/03/17 Javascript
js实现点击选项置顶动画效果
2020/08/25 Javascript
基于JavaScript实现随机点名器
2021/02/25 Javascript
Python验证文件是否可读写代码分享
2017/12/11 Python
python twilio模块实现发送手机短信功能
2019/08/02 Python
python导入不同目录下的自定义模块过程解析
2019/11/18 Python
Python如何实现爬取B站视频
2020/05/20 Python
利用Vscode进行Python开发环境配置的步骤
2020/06/22 Python
Notino匈牙利:购买香水和化妆品
2019/04/12 全球购物
营业员个人总结的自我评价
2013/10/25 职场文书
2014年企业工会工作总结
2014/11/12 职场文书
工作失职检讨书
2015/01/26 职场文书
写给同学的新学期寄语
2015/02/27 职场文书
巴黎圣母院观后感
2015/06/10 职场文书
浅谈JavaScript作用域
2021/12/06 Javascript