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。

python 复制代码
npm install @aws-sdk/client-ses

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

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

python 复制代码
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);
  }
}

控制器里调用邮件服务

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

python 复制代码
 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 个月。对于刚起步的个人开发者或者小团队来说,这是最好的机会,可以零成本练手,把邮箱验证、用户注册、后端集成等一套功能全部跑通。

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

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

相关推荐
Melrose几秒前
Flutter - 使用Jaspr来构建SEO友好网站
前端·flutter
有点笨的蛋2 分钟前
Vue3 项目:宠物照片变身冰球运动员的 AI 应用
前端·vue.js
盖头盖9 分钟前
【nodejs中的ssrf】
前端
汤姆yu10 分钟前
基于springboot的宠物服务管理系统
java·spring boot·后端
魔镜前的帅比14 分钟前
Agent 错误恢复与回退策略
python·ai
鹿角片ljp16 分钟前
智能家居控制系统Java实现
java·开发语言·智能家居
江城开朗的豌豆18 分钟前
TypeScript和JavaScript到底有什么区别?
前端·javascript
开开心心就好24 分钟前
免费卸载工具,可清理残留批量管理启动项
linux·运维·服务器·windows·随机森林·pdf·1024程序员节
猿饵块28 分钟前
python--锁
java·jvm·python
车载测试工程师30 分钟前
CAPL学习-AVB交互层-功能函数-通用函数
网络·tcp/ip·以太网·capl·canoe