Node实现邮箱服务功能

可以使用 nodemailer 这个模块提供的能力完成一些诸如邮箱登录、找回密码等功能的开发。
项目地址:https://github.com/Ewall1106/mall

配置邮件客户端

  • 我们以 QQ 邮箱为例,打开qq邮箱 > 设置 > 账户中,我们将SMTP服务开启。(默认是关闭的)

  • 接下来会有一些认证方式,按照提示操作,最后会得到一个授权码

基本使用

  • 根据官网的步骤下载这个 nodemailer 包:
$ npm install nodemailer
  • 根据官网的示例代码我们复制并进行简单配置:
'use strict';

const nodemailer = require('nodemailer');

async function main() {
  let transporter = nodemailer.createTransport({
    // 使用qq的smtp服务器
    host: 'smtp.qq.com',
    port: 587,
    secure: false,
    auth: {
      user: '这里填入你的邮箱',
      pass: '这里填入上一步生成得到的授权码',
    },
  });

  // 配置邮件标题、内容等
  // 这里我自己给自己发送一封 Test 测试邮件
  let info = await transporter.sendMail({
    from: '认证邮件',
    to: '123456@qq.com',
    subject: 'Test',
    text: 'Hello world',
    html: '<b>Hello world</b>',
  });

  console.log('Message sent:', info.messageId);
  console.log('Preview URL:', nodemailer.getTestMessageUrl(info));
}

main().catch(console.error);
  • 执行这个 js 文件:
$ node mail.js
  • 然后我们就可以从自己的邮箱中收到这封测试邮件了:


项目实践

  • 注册界面我们需要用到邮箱服务功能 来完成用户的注册。

  • 在用户点击发送邮箱验证码的时候,将邮箱作为 key验证码作为 value 存储到 redis 缓存中。(当然你也可以用其它方式将其保存下来)

async sendMail(ctx) {
  const { email } = ctx.request.body;

  try {
    // 随机生成一个验证码
    const code = 1234;
    // 将上面 `nodemailer` 发送邮箱的方法封装后在这里调用
    sendMail()
    // 设置缓存key-value键值对并设置过期时间
    setValue(email, code, 60 * 60 * 24);

    ctx.body = {
      code: 200,
      entry: '邮箱验证码已经发送成功',
    };
  } catch (err) {
    // handle error...
  }
}
  • 然后当我们点击注册按钮的时候对其校验。
async registry(ctx, next) {
  const { email, password,mailcode } = ctx.request.body;

  // 从redis缓存中获取code
  const code = await getValue(email);
  // 比对验证
  if (!code) {
    ctx.body = {
      code: 400,
      message: '请点击发送验证码重新发送',
    };
    return;
  }
  if (code !== mailcode) {
    ctx.body = {
      code: 400,
      message: '请输入正确的邮箱验证码',
    };
    return;
  }
  // ...
}
  • 邮箱服务的功能就完成了。

本文章由javascript技术分享原创和收集

发表评论 (审核通过后显示评论):