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 相关文章推荐
Javascript创建自定义对象 创建Object实例添加属性和方法
Jun 04 Javascript
Jquery使用Firefox FireBug插件调试Ajax步骤讲解
Dec 02 Javascript
jquery获取URL中参数解决中文乱码问题的两种方法
Dec 18 Javascript
JS的document.all函数使用示例
Dec 30 Javascript
Jquery的Tabs内容轮换效果实现代码,几行搞定
Feb 12 Javascript
JavaScript地理位置信息API
Jun 11 Javascript
iOS和Android用同一个二维码实现跳转下载链接的方法
Sep 28 Javascript
javascript实现文字无缝滚动
Dec 27 Javascript
javascript实现页面滚屏效果
Jan 17 Javascript
bootstrap日期插件daterangepicker使用详解
Oct 19 Javascript
微信小程序之多列表的显示和隐藏功能【附源码】
Aug 06 Javascript
bootstrap模态框关闭后清除模态框的数据方法
Aug 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
调试WordPress中定时任务的相关PHP脚本示例
2015/12/10 PHP
在Mac OS上搭建PHP的Yii框架及相关测试环境
2016/02/14 PHP
微信公众号开发客服接口实例代码
2016/10/21 PHP
YII框架中使用memcache的方法详解
2017/08/02 PHP
js文件中调用js的实现方法小结
2009/10/23 Javascript
JQUERY对单选框(radio)操作的小例子
2013/04/25 Javascript
解析js如何获取当前url中的参数值并复制给input
2013/06/23 Javascript
js的.innerHTML = &quot;&quot;IE9下显示有错误的解决方法
2013/09/16 Javascript
浅谈javascript中call()、apply()、bind()的用法
2015/04/20 Javascript
JS动画效果打开、关闭层的实现方法
2015/05/09 Javascript
JQuery PHP图片在线裁剪实例
2020/07/27 Javascript
JavaScript利用闭包实现模块化
2017/01/13 Javascript
jQuery插件HighCharts绘制2D饼图效果示例【附demo源码下载】
2017/03/21 jQuery
前端页面文件拖拽上传模块js代码示例
2017/05/19 Javascript
RxJS在TypeScript中的简单使用详解
2020/04/13 Javascript
JS判断浏览器类型与操作系统的方法分析
2020/04/30 Javascript
element-ui 实现响应式导航栏的示例代码
2020/05/08 Javascript
vue实现几秒后跳转新页面代码
2020/09/09 Javascript
vue-axios同时请求多个接口 等所有接口全部加载完成再处理操作
2020/11/09 Javascript
[02:38]DOTA2超级联赛专访Loda 认为IG世界最强
2013/05/27 DOTA
[40:29]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第一场
2018/04/10 DOTA
Python实现全角半角转换的方法
2014/08/18 Python
Python中用sleep()方法操作时间的教程
2015/05/22 Python
Python实现matplotlib显示中文的方法详解
2018/02/06 Python
利用Python如何实现数据驱动的接口自动化测试
2018/05/11 Python
python 监听salt job状态,并任务数据推送到redis中的方法
2019/01/14 Python
Python3标准库之threading进程中管理并发操作方法
2020/03/30 Python
Python astype(np.float)函数使用方法解析
2020/06/08 Python
opencv 图像礼帽和图像黑帽的实现
2020/07/07 Python
生产车间班组长岗位职责
2014/01/06 职场文书
酒店总经理岗位职责范本
2014/08/08 职场文书
后进生评语大全
2015/01/04 职场文书
解决golang 关于全局变量的坑
2021/05/06 Golang
JavaScript实现队列结构过程
2021/12/06 Javascript
golang操作rocketmq的示例代码
2022/04/06 Golang
Python采集爬取京东商品信息和评论并存入MySQL
2022/04/12 Python