头图

本篇教程教你如何编写并且部署一个发送邮件的 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"
}'

检查收件人的邮箱,如果一切配置正确,应该能收到刚刚发送的邮件。

作为参考,本文的示例项目能在这里获取到。


黄灏
4 声望0 粉丝

一个技术爱好者。


引用和评论

1 篇内容引用
0 条评论