nodemailer郵箱發(fā)送驗證碼的實現(xiàn)
前言:
想要實現(xiàn)向郵箱發(fā)送驗證碼功能,先來簡單地梳理一下思路:
前端用正則表達(dá)式簡單驗證下郵箱格式的正確性
向后端發(fā)送請求,后端隨機生成驗證碼,并根據(jù)前端傳遞的郵箱發(fā)送驗證碼
當(dāng)然實際開發(fā)中當(dāng)然沒有那么簡單,根據(jù)實際狀況書寫。
本文主要講述后端實現(xiàn)步驟,前端挺容易的,自己研究一下吧。
后端實現(xiàn)
1、前期準(zhǔn)備
以163郵箱為例(若沒有郵箱,先注冊一個新郵箱),先登錄,然后點擊設(shè)置,選擇POP3/SMTP/IMAP
再開啟服務(wù)
2、安裝nodemailer
npm i nodemailer
3、代碼實現(xiàn)
新建 utils 文件夾,該文件夾下新建mailer.js
const express = require('express'); //創(chuàng)建路由對象 const router = express.Router(); // 導(dǎo)入郵件路由處理函數(shù)對應(yīng)的模塊 const mail_handler = require("./mailHandler.js"); //掛載具體的路由 router.get('/mailer/sendmail', mail_handler)
同級目錄下新建mailHandler.js,該文件用于存放實現(xiàn)發(fā)送驗證碼的函數(shù)
// 引入數(shù)據(jù)庫 const db = require("../db/index"); // 引入bryptjs對驗證碼進(jìn)行加密 const bcrypt = require("bcryptjs"); // 郵件發(fā)送插件 let nodemailer = require("nodemailer"); // 發(fā)送驗證碼函數(shù) export.sendEmail = (req, res) => { // 創(chuàng)建一個SMTP客戶端對象 let transporter = nodemailer.createTransport({ host: 'smtp.163.com', service: "163", //郵箱類型 secure: true, //是否使用安全連接,對https協(xié)議的 port: 465, //默認(rèn)端口 auth: { user: "xxx@163.com", //開啟SMTP的郵箱,發(fā)件人 pass: "授權(quán)碼在163郵箱中可以生成", // 163授權(quán)碼 }, }); //產(chǎn)生隨機6位驗證碼 let verify = Math.random().toFixed(6).slice(-6) // 郵件內(nèi)容 let options = { from: "xxx@qq.com", //發(fā)送方 to: req.body.user_email, //接收方 subject: "激活驗證碼", //郵件主題 // 還可以是html格式,需要text改成html text: "你的驗證碼為" + code, //郵件正文 } // 發(fā)送郵件 transporter.sendMail(options, (err, info) => { if (err) { res.send(err); } else { // 加密驗證碼 code = bcrypt.hashSync(code, 10); // 將驗證碼存放到數(shù)據(jù)庫中 // 有技術(shù)的話存放到Redis緩存中去,經(jīng)常查閱數(shù)據(jù)庫可能會導(dǎo)致服務(wù)器超負(fù)荷 const sendCodeSql = "update users set user_code=? where user_email=?"; db.query(sendCodeSql, [code, req.body.user_email], (err, results) => { console.log('-----------------------------------',results) if (err) return res.cc(err); if (results.affectedRows !== 1) return res.cc("添置驗證碼失??!"); res.send({ status: 200, message: "添置驗證碼成功!", data: { info, code }, }); }); } }); }
為什么要切割成那么多文件呢?隨著技術(shù)的不斷提升,我們要逐漸形成模塊化的思想。
在app.js導(dǎo)入并注冊路由模塊
const express = require('express'); const app = express(); //導(dǎo)入路由模塊 const router = require('./route.js') //注冊路由模塊 app.use(router); app.listen(8080, () => { console.log('hello server'); }
4、效果圖
到此這篇關(guān)于nodemailer郵箱發(fā)送驗證碼的實現(xiàn)的文章就介紹到這了,更多相關(guān)node 郵箱發(fā)送驗證碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
node.js中的buffer.Buffer.byteLength方法使用說明
這篇文章主要介紹了node.js中的buffer.Buffer.byteLength方法使用說明,本文介紹了buffer.Buffer.byteLength的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下2014-12-12nodejs redis 發(fā)布訂閱機制封裝實現(xiàn)方法及實例代碼
這篇文章主要介紹了nodejs redis 發(fā)布訂閱機制封裝的相關(guān)資料,這里提供了實現(xiàn)方法,及實例代碼,具有參考價值,需要的朋友可以參考下2016-12-12module.exports和exports使用誤區(qū)案例分析
module.exports和exports使用誤區(qū),使用require()模塊時,得到的永遠(yuǎn)都是module.exports指向的對象2023-04-04nodejs教程之制作一個簡單的文章發(fā)布系統(tǒng)
本文主要講述了使用nodejs制作一個簡單的文章發(fā)布系統(tǒng),使用mongodb數(shù)據(jù)庫,時間比較緊,功能做的也比較簡單,僅僅是增刪改查,外加附近上傳,有相同需求的小伙伴可以參考下2014-11-11關(guān)于Error:EPERM:operation?not?permitted,mkdir...的幾種解決辦法對比
這篇文章主要給大家介紹了關(guān)于Error:EPERM:operation?not?permitted,mkdir...的幾種解決辦法對比,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2023-01-01nodeJS服務(wù)器的創(chuàng)建和重新啟動的實現(xiàn)方法
今天小編就為大家分享一篇nodeJS服務(wù)器的創(chuàng)建和重新啟動的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05