使用nestjs實現(xiàn)郵件發(fā)送的代碼詳解
前置準(zhǔn)備
首先我們需要開通郵箱服務(wù),這里我以qq郵箱為例子演示一下


我這里已經(jīng)開通好了,我們第一次開通時會給你一個密鑰,這個需要記下來,后面會用到。這里開通很簡單,就問你用途,無腦填即可。
當(dāng)我們開通之后,我們在nestjs中創(chuàng)建好一個郵箱服務(wù)
這里我們需要用到一個包 nodemailer 這個包的生態(tài)很成熟,幫我們做好了那些協(xié)議,我們直接用即可
我的習(xí)慣是,對于單獨的服務(wù)例如郵箱服務(wù),prisma查詢構(gòu)造生成器等,我會放到services目錄下,其他模塊想使用直接依賴注入就可
下面我們進(jìn)入實操

這個是nodemailer這個包需要配置的配置項,我們來解釋一下
host:服務(wù)器郵箱地址,這里qq的是smtp.qq.com,其他郵箱例如網(wǎng)易的,可以百度搜索的到port: 服務(wù)器端口號, qq的是465, 一般都是465secure:表示安全連接auth: 賬戶信息,第一個user就填寫你開通服務(wù)的郵箱賬號, 第二個pass就是剛剛生成的密鑰
import { Injectable } from '@nestjs/common';
import * as nodemailer from 'nodemailer';
interface MailInfo {
// 接收方郵箱
to: string;
// 標(biāo)題
subject: string;
// 文本
text?: string;
// 富文本,如果文本和富文本同時設(shè)置,富文本生效。
html?: string;
}
@Injectable()
export class EmailService {
private transporter: nodemailer.Transporter;
private mailConfig = {
host: 'smtp.qq.com',
port: 465,
secure: true,
auth: {
user: '你開通的郵箱賬號',
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
}
}對于mailConfig最好抽離成一個單獨的模塊,可以用命名空間存放,然后用configService讀取出來,這里為了演示就簡單操作了。
上面的代碼就是配置項,主要就是為了利用它的sendMail服務(wù)實現(xiàn)郵箱發(fā)送,這里需要的參數(shù),我這里也寫得很清楚了。接下來讓我們實戰(zhàn)演練,以郵箱驗證碼為例
實戰(zhàn)演練
我們在開通賬號時,我需要郵箱的驗證碼,只有驗證碼正確了才能開通,我的邏輯是,前端在點擊驗證碼發(fā)送時,將郵箱賬號傳遞到后端,此時后端生成一個驗證碼,并且存到redis中,設(shè)置有效期,然后通過郵箱服務(wù)將驗證碼發(fā)送給這個郵箱賬號,在郵箱中獲取到驗證碼后再在表單中輸入,然后提交時,再和redis中的驗證碼進(jìn)行比對。
前端代碼我就不展示了,就一個點擊發(fā)送后設(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中,后面添加用戶做驗證
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>
您本次的驗證碼是<span style="color:#FFB6C1; font-weight:700; font-size:24px">${emailCaptcha}</span>, 驗證碼有效期是30分鐘 </div>`,
subject: 'xxx平臺郵箱檢驗提醒'
})
}這樣當(dāng)我們前端點擊驗證碼發(fā)送后,調(diào)用這個接口,然后我們就可以在郵箱中收到驗證碼了

差不多就是這樣一個效果,具體樣式可以自己調(diào)整,核心邏輯就是這里了,后面的邏輯就很簡單了,不做演示了。
寫在最后
希望這樣一個簡單的郵件服務(wù)能夠讓大家學(xué)到新的知識。
到此這篇關(guān)于使用nestjs實現(xiàn)郵件發(fā)送的代碼詳解的文章就介紹到這了,更多相關(guān)nestjs實現(xiàn)郵件發(fā)送內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
什么是cookie?js手動創(chuàng)建和存儲cookie
cookie 是存儲于訪問者的計算機(jī)中的變量,在這個例子中我們要創(chuàng)建一個存儲訪問者名字的 cookie,需要的朋友可以參考下2014-05-05
JavaScript屏蔽Backspace鍵的實現(xiàn)代碼
這篇文章主要介紹了JavaScript屏蔽Backspace鍵的實現(xiàn)代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-11-11
在Monaco Editor中實現(xiàn)斷點設(shè)置的方法詳解
Monaco Editor 是 vscode 等產(chǎn)品使用的代碼編輯器,功能強(qiáng)大(且復(fù)雜),由微軟維護(hù),本文在 React + TypeScript(Vite)框架下使用 @monaco-editor/react 并介紹開發(fā)斷點顯示時踩到的坑,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下2024-04-04
通過學(xué)習(xí)bootstrop導(dǎo)航條學(xué)會修改bootstrop顏色基調(diào)
這篇文章主要介紹了通過學(xué)習(xí)bootstrop導(dǎo)航條學(xué)會修改bootstrop顏色基調(diào),需要的朋友可以參考下2017-06-06
在Postman的腳本中如何使用pm對象獲取接口的請求參數(shù)
這篇文章主要介紹了在Postman的腳本中如何使用pm對象獲取接口的請求參數(shù),本文通過實例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09

