node发送邮件功能的实现

12/28/2020 Node

很多项目都会有登录功能,登录又分为短信验证码登录和邮箱验证码登录.两者都需要服务端发送随机验证码给客户端,今天我们来实现一个简单的发送邮件的功能吧

# 初始化项目

mkdir node-mail && cd $_
yarn init -y

首先,我们创建一个项目然后进入此项目,并且进行初始化操作

# 安装插件

yarn add nodemailer

安装插件,具体插件的详细说明看这里 (opens new window)

# 编写代码

'use strict'
const nodemailer = require('nodemailer')
const fs = require('fs')
const path = require('path')

const transporter = nodemailer.createTransport({
  service: '163', //使用的邮箱类型,全部类型可以查看官网
  secureConnection: true, // 使用了SSL
  auth: {
    user: 'zhangsan_test@163.com',
    pass: 'xxx', // 授权码,不是密码,一般可以通过发送短信验证码来获取,且只展示一次,记得保存好
  },
})

let code = Math.random()
  .toString()
  .substr(2, 6) //随机生成6位验证码

let mailOptions = {
  from: 'zhangsan_test@163.com',
  // to:'12345@qq.com',  //邮件接收方,单个邮箱 字符串写法
  to: ['12345@qq.com', '12346@qq.com'], //多个邮箱 数组写法
  subject: 'Hello this is zhangsan from zhejiang', //主题
  text: `您的验证码是${code},验证码在10分钟内有效`, //正文内容,可以是text文本形式,也可以是一个html页面
  // html:fs.createReadStream(path.resolve(__dirname,'index.html')),  //引用一个html形式,可以在根目录创建一个html文件
  attachments: [
    //附件
    {
      filename: '1.png',
      path: path.resolve(__dirname, 'images/1.png'),
      cid: '01',
    },
    {
      filename: '1.txt',
      content: 'Hello world !!!',
    },
    {
      filename: '2.txt',
      path: './2.txt',
    },
  ],
}

transporter.sendMail(mailOptions, (error, info) => {
  console.log({ code })
  if (error) {
    return console.log(error)
  }
  console.log(info)
})

注意: html 里面是可以写样式的,内联样式和行内样式都是可以的.想要引用图片,若图片较小可以转为 base64,图片较大则建议使用对象存储,引用 cdn.

# 测试结果

在终端键入 node app.js 查看运行结果,若出现下面的日志,则证明我们的邮件已经发送成功了

{
  accepted: [ '12345@qq.com', '12346@qq.com' ],
  rejected: [],
  envelopeTime: 726,
  messageTime: 376,
  messageSize: 381,
  response: '250 Mail OK queued as smtp11,xxxx--.4S2 xxxxx',
  envelope: {
    from: 'zhangsan_test@163.com',
    to: [ '12345@qq.com', '12346@qq.com' ]
  },
  messageId: '<xxx@163.com>'
}

自此,一个简单的发送邮件的功能就已经完成了.当然,想要运用到真正的业务当中,还需要很多额外的逻辑判断.比如限制发送频率等.

    希望像星光一样闪烁
    文雀