在做自己的node項(xiàng)目極客教程時(shí)存璃,需要開發(fā)一個(gè)注冊(cè)郵箱激活的功能咐刨,這個(gè)功能非常常見,當(dāng)我們注冊(cè)一個(gè)賬號(hào)時(shí)度帮,肯定會(huì)有這步歼捏,下面看下如何實(shí)現(xiàn)這個(gè)功能。
1. 注冊(cè)郵箱
先注冊(cè)一個(gè)支持發(fā)送驗(yàn)證郵件的郵箱笨篷,我這里注冊(cè)的是網(wǎng)易的163郵箱瞳秽,所以下面都是以163郵箱作為發(fā)件郵箱
注冊(cè)成功后進(jìn)行登錄,然后點(diǎn)擊導(dǎo)航欄的設(shè)置率翅,選擇POP3/SMTP/IMAP练俐,開啟POP3/SMTP/IMAP服務(wù),設(shè)置授權(quán)碼就可以了冕臭。
2. 下載nodemailer插件
在命令行輸入:npm install --save nodemailer
3. 編寫發(fā)送郵件代碼
3.1 對(duì)發(fā)送激活郵件代碼進(jìn)行封裝腺晾,然后導(dǎo)出:
//email.js
// 引入 nodemailer
const nodemailer = require('nodemailer');
// 創(chuàng)建一個(gè)SMTP客戶端配置
const config = {
host: 'smtp.163.com',
port: 465,
auth: {
user: 'xxxx@163.com', //剛才注冊(cè)的郵箱賬號(hào)
pass: 'xxxxxx' //郵箱的授權(quán)碼,不是注冊(cè)時(shí)的密碼
}
};
// 創(chuàng)建一個(gè)SMTP客戶端對(duì)象
const transporter = nodemailer.createTransport(config);
// 發(fā)送郵件
module.exports = function (mail){
transporter.sendMail(mail, function(error, info){
if(error) {
return console.log(error);
}
console.log('mail sent:', info.response);
});
};
3.2 進(jìn)行測(cè)試:
//sendtest.js
var send = require('./email.js');
// 創(chuàng)建一個(gè)郵件對(duì)象
var mail = {
// 發(fā)件人
from: '極客教程 <xxxx@163.com>',
// 主題
subject: '[極客教程]激活郵箱賬號(hào)',
// 收件人
to: 'xxxx@qq.com',
// 郵件內(nèi)容浴韭,HTML格式
text: `尊敬的${user.name}丘喻,您好!點(diǎn)擊鏈接即可激活您的極客教程
網(wǎng)賬號(hào),http://localhost:3000/checkCode?name=${user.name}&code=${user.code}為保障您的帳號(hào)安全念颈,請(qǐng)?jiān)?4小時(shí)內(nèi)點(diǎn)擊該鏈接,您也可以將鏈接復(fù)制到瀏覽器地址欄訪問连霉。 若如果您并未嘗試修改密碼榴芳,請(qǐng)忽略本郵件,由此給您帶來的不便請(qǐng)諒解跺撼。本郵件由系統(tǒng)自動(dòng)發(fā)出窟感,請(qǐng)勿直接回復(fù)!` //接收激活請(qǐng)求的鏈接
};
send(mail);
成功就可以在測(cè)試的郵箱看到所發(fā)的信息歉井。
4. 驗(yàn)證步驟
簡(jiǎn)單的講一下如何實(shí)現(xiàn)郵箱驗(yàn)證柿祈。
1 . 在自己定義的數(shù)據(jù)庫(kù)用戶數(shù)據(jù)結(jié)構(gòu)中一定要有激活碼、過期時(shí)間、是否已經(jīng)激活的字段躏嚎,用于在激活時(shí)進(jìn)行判斷蜜自;
{
code: String, //激活碼,格式自己定義
date: Number, //過期日期卢佣,過期后不能激活
islive: Boolean //判斷是否激活
}
2 . 發(fā)送激活鏈接重荠,其中包含用戶名和激活碼,如下面這樣:
// 創(chuàng)建一個(gè)郵件對(duì)象
var mail = {
// 發(fā)件人
from: '極客教程 <xxxx@163.com>',
// 主題
subject: '[極客教程]激活郵箱賬號(hào)',
// 收件人
to: 'xxxx@qq.com',
// 郵件內(nèi)容虚茶,HTML格式
text: `尊敬的${user.name}戈鲁,您好!點(diǎn)擊鏈接即可激活您的極客教程
網(wǎng)賬號(hào),http://localhost:3000/checkCode?name=${user.name}&code=${user.code}為保障您的帳號(hào)安全嘹叫,請(qǐng)?jiān)?4小時(shí)內(nèi)點(diǎn)擊該鏈接婆殿,您也可以將鏈接復(fù)制到瀏覽器地址欄訪問。 若如果您并未嘗試修改密碼罩扇,請(qǐng)忽略本郵件鸣皂,由此給您帶來的不便請(qǐng)諒解。本郵件由系統(tǒng)自動(dòng)發(fā)出暮蹂,請(qǐng)勿直接回復(fù)寞缝!` //接收激活請(qǐng)求的鏈接
};
send(mail);
3 . 響應(yīng)激活請(qǐng)求,根據(jù)激活鏈接的用戶名進(jìn)行查找仰泻,若用戶存在則判斷激活碼是否一致荆陆,并判斷激活碼是否過期,全部正確則改變激活狀態(tài)集侯,此時(shí)激活成功被啼,如下代碼:
// 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. 遇到的問題
開發(fā)中遇到如下問題:
{ [AuthError: Invalid login - 535 Error: authentication failed]
name: ‘AuthError’,
data: ‘535 Error: authentication failed’,
stage: ‘a(chǎn)uth’ }
smtp服務(wù)器驗(yàn)證不通過,因?yàn)榫W(wǎng)易的郵箱有個(gè)授權(quán)限制棠枉,一定要好好檢查你注冊(cè)郵箱時(shí)的賬號(hào)和授權(quán)碼浓体。