本篇教程教你如何编写并且部署一个发送邮件的 API 服务器,用简单的 REST API 实现自动化发送邮件。类似的产品有国外的 EmailEngine。
本教程基于我的 Nuxt + ESLint 项目,参考为 Nuxt 项目添加 ESLint。
添加发送邮件的 Lib
发送邮件需要用到 SMTP 协议,我们通过 nodemailer
这个库来使用 SMTP 协议,而不是从头写起。安装的方法是
pnpm add nodemailer
pnpm add -D @types/nodemailer
添加 API 入口
新增文件 server/api/sendmail.ts
,就可以通过以下这个 API 接口访问
http://localhost:3000/api/sendmail
初始化到邮件服务器的链路
发送邮件需要一个发送者的邮箱,才能以发送者的名义发消息。我们的服务需要连接到邮件服务器,并且用发送者的账号密码通过认证。
const transporter = nodemailer.createTransport({
port: 465, // 服务器端口
host: 'smtp.qq.com', // 服务器地址
auth: {
user: config.sendmailUser, // 发送者的邮箱账号,如 'xxx@qq.com'
pass: config.sendmailPass, // SMTP授权码
},
secure: true,
})
const ok = await transporter.verify() // 校验是否连接成功
以 QQ 邮箱为例,服务器地址、端口和授权码可以在这些文档里找到
编写发送邮件的代码
我们期望的输入参数,简单就是
- 对方邮箱,也就是收件人
- 邮件标题和正文
在 server/api/sendmail.ts
里添加
export default defineEventHandler(async (event) => {
const config = useRuntimeConfig(event)
const transporter = await getTransporter() // 获得上面已经初始化的 transporter
if (!mailer) {
return { ok: false }
}
const body = await readBody(event)
const { to, subject, text } = body // 从请求里提取参数
await transporter.sendMail({
from: config.sendmailUser, // QQ邮箱要求发件人必须是认证的邮箱账号
to, subject, text,
})
return { ok: true }
})
启动服务器
用 pnpm build
构建项目,然后启动
NUXT_SENDMAIL_USER=sender@qq.com NUXT_SENDMAIL_PASS=xxx node .output/server/index.mjs
调用接口
curl --request POST 'http://localhost:3000/api/sendmail' \
--header 'Content-Type: application/json' \
--data-raw '{
"to": "receiver@gmail.com",
"subject": "标题1234",
"text": "正文1234"
}'
检查收件人的邮箱,如果一切配置正确,应该能收到刚刚发送的邮件。
作为参考,本文的示例项目能在这里获取到。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。