掘金 后端 ( ) • 2024-03-28 11:20

yma16-logo

⭐背景

大家好,我是yma16,本文分享 node_koa后端——生成验证码存入redis并使用smtp发送邮件。

面向对象:前端初学者、前端转后端的同学

该系列往期文章

node_koa后端——初始化配置jwt和swagger的koa框架

node_koa后端——连接redis缓存数据

smtp

SMTP是一种提供可靠且有效的电子邮件传输的协议。SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于系统之间的邮件信息传递,并提供有关来信的通知。SMTP独立于特定的传输子系统,且只需要可靠有序的数据流信道支持,SMTP的重要特性之一是其能跨越网络传输邮件,即“SMTP邮件中继”。使用SMTP,可实现相同网络处理进程之间的邮件传输,也可通过中继器或网关实现某处理进程与其他网络之间的邮件传输。

⭐ Nodemailer 库发送邮件

安装 nodemailer 库 npm install nodemailer

coding环节

✏️ 封装 Nodemailer发送邮件

可以预先配置smtp的免费邮箱验证码 这里可以选择qq邮箱->账号设置->POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务

image.png

创建utils/email/index.js

const nodemailer = require('nodemailer')

//创建一个SMTP客户端配置对象
const transporter = nodemailer.createTransport({
    // 默认支持的邮箱服务包括:”QQ”、”163”、”126”、”iCloud”、”Hotmail”、”Yahoo”等
    service: "QQ",
    auth: {
        // 发件人邮箱账号
        user: '[email protected]',
        //发件人邮箱的授权码 需要在自己的邮箱设置中生成,并不是邮件的登录密码
        pass: '******'
    }
})
const sendEmail=(toUserEmail,title,content)=>{
    return new Promise(resolve=>{

        // 配置收件人信息
        const receiver = {
            // 发件人 邮箱  '昵称<发件人邮箱>'
            from: `[email protected]`,
            // 主题
            subject:title,
            // 收件人 的邮箱 可以是其他邮箱 不一定是qq邮箱
            to:toUserEmail,
            // 可以使用html标签
            html: content
        };

        // 发送邮件
        transporter.sendMail(receiver, (error, info) => {
            if (error) {
                resolve({
                    code:0,
                    msg:error
                })
            }
            transporter.close()
            resolve({
                code:200,
                msg:'success'
            })
        })
    })
};
module.exports={
    sendEmail
}

✏️ 写一个发送邮件验证码的api

创建一个route/routes/email.js

const Router = require('koa-router');
const router = new Router();
const {sendEmail}=require('../../utils/email/index');
const {getRedisKey,setRedisConfig}=require('../../utils/redis/index');
// 随机字符串
function randomString(length) {
    const chars='0123456789'
    let result = '';
    for (let i = length; i > 0; --i) result += chars[Math.floor(Math.random() * chars.length)];
    return result;
}

// 发送邮件验证码
router.post('/sendEmailCode', async (ctx) => {
    try{
        const bodyParams =  ctx.request.body
        const {email}=bodyParams
        console.log('email',email)
        const code=randomString(4)
        const content=`<p>验证码:<span style="color:lightskyblue">${code}</span><p>`
        const title='请查收验证码'
        setRedisConfig(email,code)
        console.log('code',code)
        const res=await sendEmail(email,title,content)
        ctx.body = {
            code:res.code,
            data:{
                emailRes:res,
                code:code
            },
            msg:'success'
        };
    }
    catch(r){
        ctx.body={
            code:0,
            msg:r
        }
    }
});

module.exports = router;

🎈 apifox测试验证接口

apifox测试接口

  • path: http://localhost:3333/api/sendEmailCode
  • method: post
  • data: email:[email protected]

通信成功! image.png 查收邮箱成功!

image.png

⭐结束

本文分享到这结束,如有错误或者不足之处欢迎指出!

image.png

👍 点赞,是我创作的动力!

⭐️ 收藏,是我努力的方向!

✏️ 评论,是我进步的财富!

💖 最后,感谢你的阅读!