node 使用 nodemailer工具發(fā)送驗(yàn)證碼到郵箱
最近閑著沒(méi)事,我就在練習(xí)使用node和mysql編寫接口,計(jì)劃寫一個(gè)完整的vue系統(tǒng)。剛剛處理完注冊(cè)登錄的功能,我決定加入驗(yàn)證碼驗(yàn)證。在思考是否使用手機(jī)號(hào)或郵箱驗(yàn)證時(shí),最終我選擇了將驗(yàn)證碼發(fā)送到郵箱。于是我發(fā)現(xiàn)了一個(gè)非常有用的工具——nodemailer。
功能
- 零依賴性的單個(gè)模塊–由于沒(méi)有死角,因此代碼易于審核
- 高度重視安全性
- Unicode 支持使用任何字符,包括表情符號(hào)
- Windows 支持 –您可以使用 npm在 Windows 上,就像其他模塊一樣,沒(méi)有編譯的依賴項(xiàng)。從 Azure 或 Windows 盒子免費(fèi)使用它
- 使用 HTML 內(nèi)容以及純文本替代
- 加 附件 到消息
- 嵌入式的 HTML 內(nèi)容的圖像附件–您的設(shè)計(jì)不會(huì)被阻塞
- 使用 TLS / STARTTLS 的安全電子郵件傳遞
- 不同 運(yùn)輸方式 除了內(nèi)置 SMTP 支持
- 與簽署消息 DKIM
- 自訂 插件支持 用于處理消息
- OAuth2 認(rèn)證方式
- 代理人 用于 SMTP 連接
- ES6 碼 - 沒(méi)有更多的無(wú)意內(nèi)存泄漏,由于吊裝 VAR 的
- 來(lái)自的自動(dòng)生成的電子郵件測(cè)試帳戶電子郵件
1.先下nodemailer載依賴
npm i nodemailer 或 yarn add nodemailer
2.在utils文件下創(chuàng)建sendEmail.js,引入nodemailer模塊
const nodemailer = require('nodemailer')
創(chuàng)建一個(gè)SMTP客戶端配置對(duì)象:
nodemailer.createTransport({ host: "smtp.qq.com", // 郵箱服務(wù)的host,我使用的是QQ郵箱 port: 465, secure: true, auth: { user: 'XXX@qq.com', 發(fā)送郵件的郵箱 pass: '郵箱授權(quán)碼' } });
郵箱授權(quán)碼獲取:
登錄qq郵箱-》點(diǎn)擊設(shè)置,找到賬戶,下滑找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務(wù),
開(kāi)啟服務(wù),按照指示即可獲取。
設(shè)置收件人:
mailOptions = { from: '來(lái)自XX<XXX@qq.com>', //發(fā)送郵件的郵箱信息 to: toEmail, // 發(fā)送給誰(shuí)的郵箱 subject: "驗(yàn)證碼", // 標(biāo)題 // text: `你的驗(yàn)證碼為XXX,3分鐘內(nèi)有效,請(qǐng)務(wù)透漏給他人`,//發(fā)送文本 html: "你的驗(yàn)證碼為<b style='color:skybkue;'>" + XXX + "</b>,3分鐘內(nèi)有效,請(qǐng)務(wù)透漏給他人!", }
調(diào)用transporter.sendMail發(fā)送郵件:
transporter.sendMail(mailOptions)
完整代碼
sendEmail.js =>
const nodemailer = require('nodemailer') const sendEmail = (toEmail, sendText, host = 'smtp.qq.com') => { return new Promise((resolve, reject) => { let transporter = nodemailer.createTransport({ host: host, port: 465, // 開(kāi)啟安全連接,這個(gè)開(kāi)不開(kāi)都可以,對(duì)安全性有要求的話,最好開(kāi)啟 secureConnection: true, auth: { user: 'XXX@qq.com', pass: '郵箱授權(quán)碼', }, tls: { rejectUnauthorized: false, // 拒絕認(rèn)證就行了, 不然會(huì)報(bào)證書問(wèn)題 }, }); const mailOptions = { from: '來(lái)自XXX<XXX@qq.com>', to: toEmail, subject: "驗(yàn)證碼", html: "你的驗(yàn)證碼為<b style='color:skybkue;'>" + sendText + "</b>,3分鐘內(nèi)有效,請(qǐng)務(wù)透漏給他人!", } transporter.sendMail(mailOptions, (error, info) => { if (error) { reject(error); } else { resolve(info) } }) }) } module.exports = { sendEmail }
調(diào)用sendEmail獲取驗(yàn)證碼接口 =>:
const { sendEmail } = require("../utils/sendEmail"); /*email 郵箱賬戶 passWord 密碼 verification_code 驗(yàn)證碼 code_expires 驗(yàn)證碼有效期 code_effective 驗(yàn)證碼是否有效 (0 無(wú)效 ;1 有效 */ exports.GetCaptcha = async (req, res) => { try { const isExit = await resSql('SHOW TABLES LIKE "userAccount"'); if (!isExit.length) { await resSql( `CREATE TABLE userAccount(email VARCHAR(50) NOT NULL,passWord VARCHAR(255),verification_code INT(10),code_expires VARCHAR(255),code_effective TINYINT(1) DEFAULT 0,PRIMARY KEY (email))` ); } // 發(fā)送驗(yàn)證碼到郵箱 // console.log('=========檢測(cè)郵箱格式======='); const { email } = req.body; const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (!emailRegex.test(email)) { res.json({ code: 500, message: "錯(cuò)誤的郵箱格式", }); return; } // 設(shè)置驗(yàn)證碼 let verification_code = ""; for (let i = 0; i < 6; i++) { verification_code += parseInt(Math.random() * 10); } const now_timestamp = moment().format("x"); // 驗(yàn)證碼3min內(nèi)有效 const code_expires = `${Number(now_timestamp) + 180000}`; // 查詢email是否存在 const isExitEmail = await resSql( `SELECT * FROM userAccount WHERE email='${email}'` ); // 插入 let sendCodeSql = `INSERT INTO userAccount (email, verification_code, code_expires, code_effective) VALUES ("${email}", "${verification_code}", "${code_expires}", 1)`; if (isExitEmail.length) { // 存在就修改 sendCodeSql = `UPDATE userAccount SET verification_code='${verification_code}', code_expires='${code_expires}', code_effective=1 WHERE email='${email}'`; } sendEmail(email, verification_code) .then(async () => { try { await resSql(sendCodeSql); res.json({ code: 200, message: "發(fā)送成功!驗(yàn)證碼3分鐘內(nèi)有效", }); } catch (error) { res.json({ code: 500, message: error, }); } }) .catch((err) => { res.json({ code: 500, message: err || "發(fā)送失敗", }); }); } catch (error) { res.json({ code: 500, message: error || "錯(cuò)誤返回", }); } };
到此這篇關(guān)于node 使用 nodemailer 發(fā)送驗(yàn)證碼到郵箱的文章就介紹到這了,更多相關(guān)node發(fā)送驗(yàn)證碼到郵箱內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Linux Centos7.2下安裝nodejs&npm配置全局路徑的教程
今天小編就為大家分享一篇Linux Centos7.2下安裝nodejs&npm配置全局路徑的教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05Node.js+Express+Mysql 實(shí)現(xiàn)增刪改查
這篇文章主要介紹了Node.js+Express+Mysql 實(shí)現(xiàn)增刪改查,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-0430分鐘用Node.js構(gòu)建一個(gè)API服務(wù)器的步驟詳解
這篇文章主要介紹了30分鐘用Node.js構(gòu)建一個(gè)API服務(wù)器的步驟詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05nodejs的http和https下載遠(yuǎn)程資源post數(shù)據(jù)實(shí)例
這篇文章主要為大家介紹了nodejs的http和https下載遠(yuǎn)程資源post數(shù)據(jù)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09利用node.js實(shí)現(xiàn)反向代理的方法詳解
在實(shí)際工程開(kāi)發(fā)中,會(huì)有前后端分離的需求。為了平滑的完成前端請(qǐng)求到后端各個(gè)獨(dú)立服務(wù),需要一個(gè)中間件實(shí)現(xiàn)請(qǐng)求轉(zhuǎn)發(fā)的功能,利用Nginx可以實(shí)現(xiàn),在這里使用nodejs實(shí)現(xiàn)一個(gè)反向代理服務(wù)器。本文主要介紹了關(guān)于利用node.js實(shí)現(xiàn)反向代理的相關(guān)資料,需要的朋友可以參考下。2017-07-07Node.js連接MongoDB數(shù)據(jù)庫(kù)產(chǎn)生的問(wèn)題
Node.js是使用JavaScript 編寫的可以運(yùn)行在服務(wù)端的JS語(yǔ)言。node.js和mongodb碰撞會(huì)產(chǎn)生一系列問(wèn)題,下面通過(guò)本文給大家分享Node.js連接MongoDB數(shù)據(jù)庫(kù),需要的的朋友參考下2017-02-02