当前位置: 首页 > news >正文

Amazon SES + NestJS 实战:零成本打造高送达率邮箱验证方案

引言

在当今的应用开发中,邮箱验证几乎是标配。无论是注册、找回密码还是绑定账号,我们都需要确保用户提供的邮箱是真实可用的。对开发者来说,这看似简单的功能,其实涉及到邮件服务的选择、后端集成以及防止进入垃圾邮箱等一系列细节问题。

我最近的一个项目就遇到了这个需求,于是我选择了Amazon Simple Email Service作为邮件发送服务,并在 NestJS 后端中集成它,构建了一个完整的邮箱验证流程。今天我就把整个过程用通俗易懂的语言梳理出来,手把手带你实现一个生产可用的邮件验证功能。

什么是 Amazon SES?

Amazon SES,是亚马逊云科技提供的一个云端邮件服务。它的特点就是“简单”和“强大”:既能大规模稳定发送邮件,又不用你去操心复杂的邮件服务器配置。你可以用它来发送事务性邮件、营销邮件、通知邮件等等。更重要的是,它的价格非常划算,你只需按使用量付费,不用担心多余的资源浪费。

那么为什么我选择用Amazon SES来做邮箱验证?主要有三点原因:第一,它的送达率非常高,大部分邮件都能顺利到达收件箱,而不是被系统丢到垃圾邮件里;第二,它的扩展性好,就算你的应用用户量猛增,每天要发几百万封邮件,它也能轻松支撑;第三,成本可控,对于刚起步的应用来说非常友好。

顺便说一句,如果你现在还没有亚马逊云科技账号,可以先去注册一个海外区账户,因为亚马逊云科技刚刚推出了 Free Tier 2.0 新版本,新用户最高可以领取 200 美元的抵扣金:注册就送 100 美元,再完成 EC2、RDS、Lambda、Bedrock、Budgets 这五个小任务还能再拿 100 美元。这个免费计划最长能用 6 个月,而且不会有误扣费的风险,完全可以零成本上手做实验,非常适合刚接触开发者。

如何在Amazon上配置 SES?

第一步当然是注册亚马逊云科技账号。如果你还没有,就去官网注册一个。这里推荐直接选择免费计划,先用抵扣金把功能跑通,不花钱还能学到真东西。

第二步是验证域名或邮箱。在SES控制台里,你可以验证一个完整的域名,也可以只验证一个邮箱地址。如果只是学习和实验,验证邮箱就够了;但如果要上线生产环境,强烈建议验证域名,这样发出去的邮件更专业,也更不容易进垃圾箱。

第三步是申请退出沙盒环境。默认会把新账号放在SES Sandbox里,在这个模式下,你每天的邮件数量和收件人都会受到严格限制。要做真正的应用,必须申请 Production Access,把限制解除。

最后一步是获取亚马逊云科技凭证,也就是Access Key和Secret Key。有了它们,你的后端应用才能真正调用SES的接口发送邮件。

在 NestJS 中安装 SDK 并集成 SES

当 SES 准备好以后,我们就要在后端代码里集成了。NestJS 是一个基于 TypeScript 的服务端框架,集成第三方服务很方便。第一步当然是安装亚马逊云科技的官方 SDK。

npm install @aws-sdk/client-ses

这个包的作用就是让 NestJS 应用能够直接调用Amazon SES的API,从而完成邮件发送的功能。接下来我们写一个邮件服务,把发送逻辑都封装在这里。

这个服务的逻辑很简单:初始化一个SESClient,把要发的邮箱地址和验证码作为参数,组装好邮件的主题和正文,然后交给SendEmailCommand去发送

import { Injectable } from '@nestjs/common';
import { SESClient, SendEmailCommand } from '@aws-sdk/client-ses';@Injectable()
export class EmailService {private sesClient: SESClient;constructor() {this.sesClient = new SESClient({ region: 'your-region' });}async sendVerificationEmail(email: string, code: string): Promise<void> {const params = {Source: 'your-verified-email@yourdomain.com',Destination: {ToAddresses: [email],},Message: {Body: {Text: { Data: `Your verification code is: ${code}` },},Subject: { Data: 'Email Verification' },},};const command = new SendEmailCommand(params);await this.sesClient.send(command);}
}

控制器里调用邮件服务

有了服务之后,下一步就是在控制器里调用它。当用户注册或点击“发送验证码”按钮时,前端会发一个请求到后端,控制器就会触发邮件发送逻辑。

 import { Controller, Post, Body } from '@nestjs/common';
import { EmailService } from './email.service';@Controller('auth')
export class AuthController {constructor(private readonly emailService: EmailService) {}@Post('send-email-verification')async sendVerificationEmail(@Body('email') email: string) {const verificationCode = this.generateVerificationCode();await this.emailService.sendVerificationEmail(email, verificationCode);return { message: 'Verification email sent' };}private generateVerificationCode(): string {return Math.floor(100000 + Math.random() * 900000).toString(); // 6-digit code}
}

这里的逻辑是这样的:控制器监听 /auth/send-email-verification 这个接口,当有 POST 请求进来时,它会随机生成一个六位数的验证码,然后调用刚才写的 EmailService 来发送邮件。用户收到验证码后,就可以用它来完成邮箱验证。

测试整个流程

代码写好之后,当然要测试一下。我用 Postman 向 /auth/send-email-verification 发了一个带测试邮箱的请求,几秒钟后就收到了 SES 发来的验证邮件,里面有一个 6 位数的验证码。这证明整个流程是通的,从后端到Amazon,再到邮箱,一环扣一环。

总结

用Amazon SES和 NestJS 搭建邮箱验证功能,其实比你想象的要简单。一旦你理清楚了几个关键步骤——配置 SES、退出沙盒、获取凭证、安装 SDK、编写服务和控制器——整个过程就是水到渠成。这个方案不仅可靠,扩展性强,而且随着应用用户量的增长也能轻松支撑。

而且别忘了,现在Amazon Free Tier 2.0正在大放福利,注册海外区账号就能拿到最高 200 美元的抵扣金,最长免费试用 6 个月。对于刚起步的个人开发者或者小团队来说,这是最好的机会,可以零成本练手,把邮箱验证、用户注册、后端集成等一套功能全部跑通。

所以,如果你正打算给应用加上邮箱验证,不妨现在就动手试试。趁着有免费套餐的支持,把这套功能完整实现,既能提升用户体验,也能为未来的应用打下坚实的基础。

以上就是本文的全部内容啦。最后提醒一下各位工友,如果后续不再使用相关服务,别忘了在控制台关闭,避免超出免费额度产生费用~

http://www.dtcms.com/a/391812.html

相关文章:

  • MySQL 8.0临时表空间深度解析
  • 低秩矩阵:揭示高维数据中的简约之美
  • QR Wizard for Mac 好用的二维码生成器
  • 【redis】redis知识点
  • C语言模版(机试666)
  • 高通camx架构学习(二)——深入理解高通Camx Hal
  • 戴尔笔记本的奇怪功能
  • Linux文件系统结构与用户管理完全指南
  • 鸿蒙保存图片到相册
  • 【C语言】喝汽水问题分析:20元能喝多少瓶汽水?
  • 二物理层-ADSL-思考题
  • PyQt6之滑动条
  • 虚拟机ubuntu安装中文输入法
  • 康奈尔大学视觉-语言-动作模型全面综述:概念、进展、应用与挑战
  • 单片机--中断实验
  • 嵌入式 - GPIO
  • 一款商用的基于SpringBoot+VUE的出货单智能比对系统
  • systemctl 在启动服务时的 常用参数
  • 【MySQL】SQL性能分析
  • 【软件测试Linux】详细Linux介绍和各种命令的场景应用
  • 【MySQL】使用C/C++链接mysql数据库
  • 【复现】【充换电站】考虑用户充电负荷-最优分时电价互动的光储充换电站优化模型
  • 多光谱相机按不同分类的几种类型
  • Linux中select、poll 和 epoll的作用
  • JavaScript原型链全面解析
  • mysql相关优化
  • electron-forge踩坑记录
  • 00-基于django+vue3+ts的前后端分离RBAC权限管理系统
  • Go语言-->切片
  • 《Java网络编程》第二章:Stream流