使用nestjs實(shí)現(xiàn)郵件發(fā)送的代碼詳解
前置準(zhǔn)備
首先我們需要開(kāi)通郵箱服務(wù),這里我以qq郵箱為例子演示一下
我這里已經(jīng)開(kāi)通好了,我們第一次開(kāi)通時(shí)會(huì)給你一個(gè)密鑰
,這個(gè)需要記下來(lái),后面會(huì)用到。這里開(kāi)通很簡(jiǎn)單,就問(wèn)你用途,無(wú)腦填即可。
當(dāng)我們開(kāi)通之后,我們?cè)趎estjs中創(chuàng)建好一個(gè)郵箱服務(wù)
這里我們需要用到一個(gè)包 nodemailer
這個(gè)包的生態(tài)很成熟,幫我們做好了那些協(xié)議,我們直接用即可
我的習(xí)慣是,對(duì)于單獨(dú)的服務(wù)例如郵箱服務(wù),prisma查詢構(gòu)造生成器等,我會(huì)放到services目錄下,其他模塊想使用直接依賴注入就可
下面我們進(jìn)入實(shí)操
這個(gè)是nodemailer這個(gè)包需要配置的配置項(xiàng),我們來(lái)解釋一下
host
:服務(wù)器郵箱地址,這里qq的是smtp.qq.com
,其他郵箱例如網(wǎng)易的,可以百度搜索的到port
: 服務(wù)器端口號(hào), qq的是465
, 一般都是465secure
:表示安全連接auth
: 賬戶信息,第一個(gè)user就填寫你開(kāi)通服務(wù)的郵箱賬號(hào), 第二個(gè)pass就是剛剛生成的密鑰
import { Injectable } from '@nestjs/common'; import * as nodemailer from 'nodemailer'; interface MailInfo { // 接收方郵箱 to: string; // 標(biāo)題 subject: string; // 文本 text?: string; // 富文本,如果文本和富文本同時(shí)設(shè)置,富文本生效。 html?: string; } @Injectable() export class EmailService { private transporter: nodemailer.Transporter; private mailConfig = { host: 'smtp.qq.com', port: 465, secure: true, auth: { user: '你開(kāi)通的郵箱賬號(hào)', pass: '生成的密鑰' } } constructor() { this.transporter = nodemailer.createTransport(this.mailConfig); } async sendEmail(mailInfo: MailInfo) { const info = await this.transporter.sendMail({ from: this.mailConfig.auth.user, //發(fā)送方郵箱 ...mailInfo }) return info } }
對(duì)于mailConfig
最好抽離成一個(gè)單獨(dú)的模塊,可以用命名空間存放,然后用configService
讀取出來(lái),這里為了演示就簡(jiǎn)單操作了。
上面的代碼就是配置項(xiàng),主要就是為了利用它的sendMail
服務(wù)實(shí)現(xiàn)郵箱發(fā)送,這里需要的參數(shù),我這里也寫得很清楚了。接下來(lái)讓我們實(shí)戰(zhàn)演練,以郵箱驗(yàn)證碼為例
實(shí)戰(zhàn)演練
我們?cè)陂_(kāi)通賬號(hào)時(shí),我需要郵箱的驗(yàn)證碼,只有驗(yàn)證碼正確了才能開(kāi)通,我的邏輯是,前端在點(diǎn)擊驗(yàn)證碼發(fā)送時(shí),將郵箱賬號(hào)傳遞到后端,此時(shí)后端生成一個(gè)驗(yàn)證碼,并且存到redis中,設(shè)置有效期,然后通過(guò)郵箱服務(wù)將驗(yàn)證碼發(fā)送給這個(gè)郵箱賬號(hào),在郵箱中獲取到驗(yàn)證碼后再在表單中輸入,然后提交時(shí),再和redis中的驗(yàn)證碼進(jìn)行比對(duì)。
前端代碼我就不展示了,就一個(gè)點(diǎn)擊發(fā)送后設(shè)置一個(gè)倒計(jì)時(shí),主要還是展示后端
@Post('/send/emailCaptcha') async sendEmailCaptcha(@Body() emailInfo: {email: string}){ if(!emailInfo) { throw new HttpException('郵箱不能為空', HttpStatus.BAD_REQUEST) } //生成隨機(jī)四位數(shù) const emailCaptcha = Math.floor(Math.random() * 9000) + 1000 //生成的數(shù)據(jù)存在redis中,后面添加用戶做驗(yàn)證 await this.redisClient .multi() .set( `emailCaptcha:${emailInfo.email}`, emailCaptcha, ) .expire( `emailCaptcha:${emailInfo.email}`, 60 * 30) //30min .exec() this.emailService.sendEmail({ to: emailInfo.email, html: `<div> 您本次的驗(yàn)證碼是<span style="color:#FFB6C1; font-weight:700; font-size:24px">${emailCaptcha}</span>, 驗(yàn)證碼有效期是30分鐘 </div>`, subject: 'xxx平臺(tái)郵箱檢驗(yàn)提醒' }) }
這樣當(dāng)我們前端點(diǎn)擊驗(yàn)證碼發(fā)送后,調(diào)用這個(gè)接口,然后我們就可以在郵箱中收到驗(yàn)證碼了
差不多就是這樣一個(gè)效果,具體樣式可以自己調(diào)整,核心邏輯就是這里了,后面的邏輯就很簡(jiǎn)單了,不做演示了。
寫在最后
希望這樣一個(gè)簡(jiǎn)單的郵件服務(wù)能夠讓大家學(xué)到新的知識(shí)。
到此這篇關(guān)于使用nestjs實(shí)現(xiàn)郵件發(fā)送的代碼詳解的文章就介紹到這了,更多相關(guān)nestjs實(shí)現(xiàn)郵件發(fā)送內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
javascript中的previousSibling和nextSibling的正確用法
這篇文章主要介紹了javascript中的previousSibling和nextSibling的正確用法的相關(guān)資料,需要的朋友可以參考下2015-09-09每天一篇javascript學(xué)習(xí)小結(jié)(Array數(shù)組)
這篇文章主要介紹了javascript中的Array數(shù)組知識(shí)點(diǎn),對(duì)數(shù)組的基本使用方法,以及各種方法進(jìn)行整理,感興趣的小伙伴們可以參考一下2015-11-11《JavaScript高級(jí)程序設(shè)計(jì)》閱讀筆記(一) ECMAScript基礎(chǔ)
ECMAScript基礎(chǔ),主要包括語(yǔ)法,變量,關(guān)鍵字,保留字,原始值和引用值等2012-02-02最簡(jiǎn)單的JavaScript驗(yàn)證整數(shù)、小數(shù)、實(shí)數(shù)、有效位小數(shù)正則表達(dá)式
這篇文章主要介紹了最簡(jiǎn)單的JavaScript驗(yàn)證整數(shù)、小數(shù)、實(shí)數(shù)、有效位小數(shù)正則表達(dá)式,其中包含保留1位小數(shù)、保留2位小數(shù)、保留3位小數(shù)等正則,需要的朋友可以參考下2015-04-04