Nodejs 第二十八章 邮件服务
邮件服务在工作中扮演着多种关键角色,帮助提高团队效率和沟通流畅性。下面详细解释邮件服务在不同工作场景中的应用:
-
任务分配与跟踪:
- 用途:邮件服务常用于分配具体任务、指派工作责任,并追踪项目的进展。
- 功能:通过发送包含任务清单、工作指示和进度更新的邮件,可以确保每个团队成员都明确自己的职责和任务要求。这种通信方式能够有效帮助团队领导或项目管理者持续监控工作的完成情况。
-
错误报告和故障排除:
- 用途:当软件或系统出现错误时,开发人员可以通过邮件向团队或相关人员报告问题。
- 功能:邮件中可以包含详细的错误信息、重现问题的步骤以及问题发生的环境。团队成员就能够快速了解问题所在,并协助进行故障排除和修复。详细信息可能包括错误日志、堆栈跟踪以及可能的修复建议,使团队能更有效地响应和处理问题。
-
自动化构建和持续集成:
- 用途:在持续集成(CI)和自动化构建的环境中,邮件服务用于通知团队成员关于构建状态的重要更新。
- 功能:邮件通知可以包括构建成功或失败的信息、单元测试结果、代码覆盖率等。如果构建过程中出现错误或警告,系统会自动发送邮件给相关人员,他们就能及时了解并采取必要的措施。
第三方库使用
js-yaml
- 作用 :
js-yaml
是一个用于解析和生成 YAML(一种常用于配置文件的人类友好的数据序列化标准)的 JavaScript 库。 - 用途:它允许开发者在 Node.js 应用中轻松读取、写入和处理 YAML 文件。这对于配置管理特别有用,因为 YAML 格式的可读性比 JSON 更好,常用于存储配置设置。
nodemailer
- 作用 :
nodemailer
是一个在 Node.js 中发送电子邮件的模块。 - 用途 :它支持各种邮件发送选项,包括但不限于文本内容、HTML内容、附件等。
nodemailer
可以与SMTP(简单邮件传输协议)服务配合使用,也支持直接传输和其他传输方法(如 Sendmail),使得它在应用程序中实现自动邮件通知、用户验证邮件和其他邮件发送功能变得非常简单。
yaml文件格式
-
我们邮件的账号(密码| 授权码)不可能明文写到代码中,一般存放在yaml文件或者环境变量里面
- pass就是password(密码),user则是用户邮箱账号
- 这里需要注意在
pass:
或者user:
后面继续填写内容的时候,要加上空格
yaml
# js-yaml 解析yaml文件
pass: 授权码 | 密码
user: xxxxx@qq.com 邮箱账号
代码实现
初始化邮件服务
-
首先,是肯定需要先将两个需要用到的第三方库下载下来
-
mailer就是邮寄的意思,而nodemailer就是node-mailer=>使用node实现的邮件服务
npm install js-yaml
npm install nodemailer
-
-
然后创建一个mail.http文件用来模拟发送请求(前面章节就有讲到了),一个mail.yaml文件用来存储内容,以及一个index.js用来写我们的代码啦
php
import nodemailer from "nodemailer"
// 初始化邮件服务
const transport = nodemailer.createTransport({
service:'qq',
host:"smtp.qq.com",
port:465,//具体含义后面说
secure:true,//是否要使用https
auth:{
user:"",//邮箱账号
pass:""//邮箱密码/授权码
}
})
-
这时候,我们可能就要疑惑了,这些参数要具体填写什么,我要去哪里看,比如说port端口参数,为什么要填465,有什么含义吗?
- 很显然,这是有的,我们需要看QQ邮件服务文档 ,地址:SMTP/IMAP服务 (qq.com)
- 那在这里面,我们就能够知道port为什么要填写465了,因为QQ的文档里面已经有写明如何使用了
POP3/SMTP 设置方法
用户名/帐户: 你的QQ邮箱完整的地址
密码 : 生成的授权码
电子邮件地址: 你的QQ邮箱的完整邮件地址
接收邮件服务器: pop.qq.com,使用SSL,端口号995
发送邮件服务器: smtp.qq.com,使用SSL,端口号465或587
授权码生成
- 如何拿到授权码,就需要通过我们前面写出来的QQ开发文档链接跳转进去找到下图中的内容
- 然后选择生成授权码就OK了
- 成功生成界面如下:
-
从设备管理中,可以看到我们目前管理的授权码,然后将其存进
mail.yaml文件
里面- yaml存放的格式已经写在上面了,照着填进去就OK了
- user填写QQ邮箱,pass填写我们刚刚拿到的授权码
实现发送邮件功能
- yaml文件设置好了之后,我们只需要在
index.js
中,将其读取出来,然后放入auth参数
中。这里之所以绕一个弯路,不直接把内容存放进去的原因,就是为了防止隐私泄露(不用明文形式)
php
import nodemailer from "nodemailer"
import yaml from "js-yaml"
import fs from "node:fs"
const mailConfig = yaml.load(fs.readFileSync('./mail.yaml', 'utf-8'))
// 初始化邮件服务
const transport = nodemailer.createTransport({
service: 'qq',
host: "smtp.qq.com",
port: 465,
secure: true,//是否要使用https
auth: {
user: mailConfig.user,//邮箱账号
pass: mailConfig.pass//邮箱密码/授权码
}
})
-
接下来就要起一个服务,然后实现发送邮件的功能。没错,现在才要开始实现,我们前面的内容是配置发送邮件的前置信息
- 在下面这段代码中,我们在发送内容之前,必须要判断一下,是否是我们发送邮箱的地址,比如我们这里是以
/send/mail
进行发送的,这和我们区分动静分离的方式是有点像的,我们这里区分出来的是专门为了发送邮箱的接口 - 其中to、subject、text都是不确定的参数,只有from是确定的。所以只有一个from可以写死(就是我们用来发送信息的那个邮箱账号)。而其他的三样内容都是要根据发送的请求携带参数来填入,且我们携带的这些参数作为邮件来说,必然是私密性质的,所以需要判断请求是否为POST请求才行
- 在下面这段代码中,我们在发送内容之前,必须要判断一下,是否是我们发送邮箱的地址,比如我们这里是以
javascript
const server = http.createServer((req, res) => {
const { pathname } = url.prase(req.url)
const { method } = req
if(method === 'POST' && pathname === '/send/mail'){
// 发送邮件
transport.sendMail( {
to:'收件人',
from:'发件人',
subject:'主题',
text:'内容'
})
}
})
server.listen(3000, () => {
console.log("3000端口已经启动");
})
-
但上面的代码是没办法动态做到将请求的对应内容填入的,我们需要进行一定的修改
- 我们先通过req.on中的data方法来监听到内容,再根据完整的数据进行JSON转化提取其中需要用到的数据传入我们的to、subject、text中
- 其中这里发送邮件运用到ES6之后的写法,
to:to
类型的写法可以省略为to
javascript
import nodemailer from "nodemailer"
import yaml from "js-yaml"
import fs from "node:fs"
import url from "node:url"
import http from "node:http"
const mailConfig = yaml.load(fs.readFileSync('./mail.yaml', 'utf-8'))
// 初始化邮件服务
const transport = nodemailer.createTransport({
service: 'qq',
host: "smtp.qq.com",
port: 465,
secure: true,//是否要使用https
auth: {
user: mailConfig.user,//邮箱账号
pass: mailConfig.pass//邮箱密码/授权码
}
})
const server = http.createServer((req, res) => {
const { pathname } = url.parse(req.url)
const { method } = req
if (method === 'POST' && pathname === '/send/mail') {
// 发送邮件
let data = '';
// 回调返回的是一个个片段,我们将其拼接起来为整体
req.on("data", (chunk) => {
data += chunk
})
req.on('end', () => {
const { to, subject, text } = JSON.parse(data)
transport.sendMail({
to,
from: mailConfig.user,
subject,
text
})
res.end("邮件发送成功")
})
// transport.sendMail( {
// to:'收件人',
// from:'发件人',
// subject:'主题',
// text:'内容'
// })
}
})
server.listen(3000, () => {
console.log("3000端口已经启动");
})
测试邮件服务
-
那这样我们也是成功写完了,现在,就让我们来编写一个http请求吧,看下是否能够实现发送邮件的功能
- 然后记得启动一下我们写在index.js中的服务
bash
//mail.http文件
POST http://localhost:3000/send/mail HTTP/1.1
Content-Type: application/json
{
"to":"1045098807@qq.com",//这里就发给我自己进行测试了,这里的注释记得删掉
"subject":"小余测试邮件发送功能",
"text":"我是小余,我为自己代言,我的微信为:XiaoYu2002-AI"
}
-
能够看到成功发送内容到我们写的邮件服务接口上了
- 通过打开QQ邮箱,我们也确实成功看到了内容成功发送