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

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

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

相关推荐
零基础的修炼4 小时前
Linux---文件系统
linux·运维·服务器
断水客4 小时前
如何自动生成ONNX模型?
人工智能·ai·onnx·ai编译器
weixin_456904275 小时前
Vue电商数据分析大屏开发
前端·vue.js·数据分析
Sunhen_Qiletian5 小时前
深度学习----ResNet(残差网络)-彻底改变深度神经网络的训练方式:通过残差学习来解决深层网络退化问题(附PyTorch实现)
网络·深度学习·dnn
深蓝电商API5 小时前
爬虫数据存储:MongoDB 在电商采集中的应用
数据库·爬虫·mongodb
青云交5 小时前
Java 大视界 -- Java 大数据机器学习模型在元宇宙虚拟场景智能交互中的关键技术
java·机器学习·边缘计算·元宇宙·多模态融合·智能交互·情感计算
弹简特5 小时前
【MySQL初阶】04-数据表的操作
数据库·mysql
一个天蝎座 白勺 程序猿5 小时前
Apache IoTDB(6):深入解析数据库管理操作——增删改查与异构数据库实战指南
数据库·apache·时序数据库·数据库管理·iotdb
十八旬5 小时前
苍穹外卖项目实战(day11-1)-记录实战教程、问题的解决方法以及完整代码
服务器·数据库·windows·redis