目录
  1. 1. nodemailer 介绍
  2. 2. 要求
  3. 3. 安装
  4. 4. 基础用法
  5. 5. UniCloud 云函数中使用
  6. 6. 效果
Nodejs 邮件通知插件 nodemailer,以及在 UniCloud 云函数中的应用

nodemailer 介绍

Nodemailer 是 Node.js 一个开源插件,可以在 Node 环境中轻松实现发送电子邮件。官方文档


要求

Node v6.0.0 或更新版本。如果 Nodemailer 中使用async..await,你需要至少有 Node v8.0.0 。


安装

1
npm i nodemailer

基础用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
const nodemailer = require('nodemailer')

async function main() {
// 创建 transporter 实例
let transporter = nodemailer.createTransport({
host: 'smtp.ethereal.email', // 邮件服务器
port: 587, // 端口
secure: false, // 使用TLS连接?一般true端口为465
auth: {
user: 'admin@example.com', // 邮箱地址
pass: 'xxxxxxxxxxxxx' // 邮箱密码或授权码
}
})

// 发送邮件
let info = await transporter.sendMail({
from: '"Fred Foo 👻" <foo@example.com>', // 发送人信息
to: 'bar@example.com, baz@example.com', // 接收人,可多个地址
subject: 'Hello ✔', // 邮件主题
text: 'Hello world?', // 纯文字内容
html: '<b>Hello world?</b>' // HTML内容
})

if (info.messageId) {
console.log('邮件发送成功')
} else {
console.log('邮件发送失败')
}
}

main().catch(console.error)

使用QQ邮箱发送为例:

  • host:smtp.qq.com
  • port:465
  • secure:true
  • auth.user:邮箱地址
  • auth.pass:邮箱授权码 (登录邮箱后台获取)

UniCloud 云函数中使用

以下为博主个人小程序他人投稿时,云函数自动发送邮件通知博主的示例。

公共模块封装:

@/uniCloud/cloudfunctions/common/tools/index.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
const nodemailer = require('nodemailer')

// 发送邮件
async function sendEmail({to, subject, html}) {
const user = 'admin@vincef0ng.cn', // 我的腾讯域名邮箱
pass = 'xxxxxxxxxxxxxxxxxx' // 我的邮箱授权码
let transporter = nodemailer.createTransport({
host: 'smtp.qq.com',
port: 465,
secure: true,
auth: {
user,
pass
}
})
const info = await transporter.sendMail({
from: `"游趣街" <${user}>`,
to,
subject,
html
})
if (info.messageId) {
return {code: 1, msg: '邮件发送成功'}
} else {
return {code: 0, msg: '邮件发送失败', details: info}
}
}

module.exports = {
// ...其他tool公共模块

// 投稿通知
sendContributeEmail: (info) => {
const { title, question, answer, authour, create_date } = info
const to = 'vincefong1018@gmail.com'
const subject = '海龟汤投稿'
const html = `<div style="border-radius:10px 10px 10px 10px;font-size:13px;color:#555;width:666px;margin:50px auto;border:1px solid #eee;max-width:100%;background:#fff repeating-linear-gradient(-45deg,#fff,#fff 1.125rem,transparent 1.125rem,transparent 2.25rem);box-shadow:0 1px 5px rgba(0,0,0,.15)"><div style="width:100%;background:#49bdad;border-radius:10px 10px 0 0;background-image:-moz-linear-gradient(0deg,#43c6b8,#ffd1f4);background-image:-webkit-linear-gradient(0deg,#43c6b8,#ffd1f4);height:66px"><p style="font-size:20px;word-break:break-all;padding:20px 32px;margin:0;background-color:hsla(0,0%,100%,.4);border-radius:10px 10px 0 0">海龟汤投稿</p></div><div style="margin:40px auto;width:90%;font-size:16px"><p>标题</p><div style="background:#fafafa repeating-linear-gradient(-45deg,#fff,#fff 1.125rem,transparent 1.125rem,transparent 2.25rem);box-shadow:0 2px 5px rgba(0,0,0,.15);margin:20px 0;padding:15px;border-radius:5px;font-size:14px;color:#555">${title}</div><p>汤面</p><div style="background:#fafafa repeating-linear-gradient(-45deg,#fff,#fff 1.125rem,transparent 1.125rem,transparent 2.25rem);box-shadow:0 2px 5px rgba(0,0,0,.15);margin:20px 0;padding:15px;border-radius:5px;font-size:14px;color:#555">${question}</div><p>汤底</p><div style="background:#fafafa repeating-linear-gradient(-45deg,#fff,#fff 1.125rem,transparent 1.125rem,transparent 2.25rem);box-shadow:0 2px 5px rgba(0,0,0,.15);margin:20px 0;padding:15px;border-radius:5px;font-size:14px;color:#555">${answer}</div><p>作者</p><div style="background:#fafafa repeating-linear-gradient(-45deg,#fff,#fff 1.125rem,transparent 1.125rem,transparent 2.25rem);box-shadow:0 2px 5px rgba(0,0,0,.15);margin:20px 0;padding:15px;border-radius:5px;font-size:14px;color:#555">${authour}</div><p>时间</p><div style="background:#fafafa repeating-linear-gradient(-45deg,#fff,#fff 1.125rem,transparent 1.125rem,transparent 2.25rem);box-shadow:0 2px 5px rgba(0,0,0,.15);margin:20px 0;padding:15px;border-radius:5px;font-size:14px;color:#555">${create_date}</div></div></div>`

return sendEmail({ to, subject, html })
}
}

需要发送邮件的云对象中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
const { sendContributeEmail } = require('tools')
module.exports = {
// 投稿
contribute: async (data) => {
const { title, question, answer, authour, share, contact } = data // 前端获取的投稿数据

// 添加数据库
const collection = uniCloud.database().collection('contribute')
const res = await collection.add(data)

if (!res.errCode) {
// 数据库添加成功后发送邮件通知博主
const info = await sendContributeEmail(data)
if (info.code) {
// 邮件发送成功
} else {
// 邮件发送失败
}
} else {
return { msg: '投稿失败', details: res }
}
}
}

效果

邮件通知效果图

文章作者: Vincent F0ng
文章链接: https://vincef0ng.cn/post/node-email-notification-nodemailer/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Vincent F0ng
请喝奶茶
  • 微信
  • 支付宝
领红包

评论(支持Markdown)