一个发送邮件的 API 服务器

LeetCode刷题
• 阅读 137

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

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

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

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Easter79 Easter79
3年前
springboot系列九,springboot整合邮件服务、整合定时任务调度
一、整合邮件服务   如果要进行邮件的整合处理,那么你一定需要有一个邮件服务器,实际上java本身提供有一套JavaMail组件以实现邮件服务器的搭建,但是这个搭建的服务器意义不大,因为你现在搭建完成了,向一些大型的站点发送一封邮件,若干小时你就会被拉黑,如果不想拉黑彼此之间就做一个白名单即可。   要发送邮件,首先要知道
Karen110 Karen110
4年前
赶在元旦前夕!10分钟用Python批量定制化发送元旦祝福邮件!
上一篇关于邮件的自动发送教程中,我们讲解了如何使用yagmail进行简单的邮件发送:现实生活中,如果只是发邮件给自己,像上一篇文章那样简陋的格式是可以接受的,但若要针对每个人进行邮件的定制化,群发给公司客户、内部员工、亲戚朋友,则需更加高级的邮件发送方式。我们可以通过HTML制作一封精美的元旦祝福邮件,但是邮件的内容——比如姓名、祝福语等应该怎样动态
徐小夕 徐小夕
4年前
如何使用nodejs自动发送邮件?
之前用Nodejs做了很多服务端模块,最近抽空复盘一下,接下来笔者将介绍如何使用Nodejs来自动向用户发送邮件.笔者将详细介绍自动发送邮箱的实现方案,以及通过一个实际的案例来带大家掌握使用nodejs自动发送邮件,最后会介绍一些实际的应用场景,来加深对该方案的理解,达到学以致用的目的.实现方案实现自动发送邮件笔者采用了基于Nod
Easter79 Easter79
3年前
SpringBoot入门 (十) 发送邮件
本文记录学习在SpringBoot中发送邮件。一邮件发送过程发送邮件是一个我们在项目中经常会用到的功能,如在用户注册时发送验证码,账户激活等都会用到。完整的一个邮件发送过程主要包含以下几个步骤:1发件人在用户邮件代理上写邮件内容及收件人的邮箱地址;2用户邮件代理根据发件人填写的邮件信息,生成一封符合邮件格式的邮件;
Stella981 Stella981
3年前
Jenkins 配置邮件通知步骤
Jenkins配置邮件通知前言可以在Jenkins中配置邮件通知,比如在构建失败时发送邮件通知项目组来及时修复问题。Jenkins邮件通知功能的插件主要包括:MailerPlugin(默认的发送邮件插件)EmailExtensionPlugin(功能更强大的发送邮件插件)建议同时安装这两个插件。下面来介绍如何在
Wesley13 Wesley13
3年前
thinkphp整合系列之友盟消息推送
上篇文章 thinkphp集成系列之phpmailer批量发送邮件(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fbaijunyao.com%2Farticle%2F69)讲过的;邮件有着零成本、内容丰富的优点;但是一个非常硬的硬伤;这家伙的及时性太差了;尤其是随着90、00
Stella981 Stella981
3年前
SpringBoot入门 (十) 发送邮件
本文记录学习在SpringBoot中发送邮件。一邮件发送过程发送邮件是一个我们在项目中经常会用到的功能,如在用户注册时发送验证码,账户激活等都会用到。完整的一个邮件发送过程主要包含以下几个步骤:1发件人在用户邮件代理上写邮件内容及收件人的邮箱地址;2用户邮件代理根据发件人填写的邮件信息,生成一封符合邮件格式的邮件;
Stella981 Stella981
3年前
Azure 上通过 SendGrid 发送邮件
SendGrid是什么?SendGrid是架构在云端的电子邮件服务,它能提供基于事务的可靠的电子邮件传递。并且具有可扩充性和实时分析的能力。常见的用例有:自动回复用户的邮件定期发送信息给用户生成报表等由于使用SendGrid这样的第三方邮件服务既稳定可靠又不用自己维护邮件服务器,
Wesley13 Wesley13
3年前
34.TCP取样器
阅读文本大概需要3分钟。1、TCP取样器的作用   TCP取样器作用就是通过TCP/IP协议来连接服务器,然后发送数据和接收数据。2、TCP取样器详解!(https://oscimg.oschina.net/oscnet/32a9b19ba1db00f321d22a0f33bcfb68a0d.png)TCPClien