每月不到 1 块钱,手把手教你避坑搭建亚马逊 SES 网站发信系统

意外富翁 · 1个月前 · 技术 · 84 · 0

这份教程为想要实现“网站验证码/找回密码”功能、追求极致性价比且不希望被 AWS 复杂账单反噬的站长编写。

很多站长在网站需要发送验证码时,第一反应是找国内插件或者第三方平台,但其实 Amazon SES (Simple Email Service) 才是全球性价比最高的“扫地僧”:发 1000 封信只要 0.1 美元(约 7 毛钱人民币),且到达率极高。

但 AWS 的后台是个“迷宫”,稍不留神就会点错月租 50 刀的开关。这篇文章帮你把坑排完。


第一阶段:注册与“降噪”设置

注册时,你会面临第一个陷阱。

  1. 站点选择:访问 aws.amazon.com。这是“全球站”,支持中国个人注册。
  2. 国家填中国:实名信息、手机号(+86)、国内 Visa/MasterCard 信用卡如实填写。不要翻墙伪装美国人,否则极易触发风控导致封号。
  3. 账户计划:选 “商业(Professional)” 填写账户信息(利于后续 SES 审核)。
  4. 支持计划(避坑重点):注册最后一步,务必选“基本支持 - 免费(Basic Support)”。如果选了开发者级,每个月会无缘无故多出 29 美元的月租费。
  5. 注册模式:如果有“免费”和“付费”对比图,建议选**“付费(Paid)”**。它包含 200 刀抵扣金且功能完整,比限期 6 个月的试用版更适合跑正式业务。

第二阶段:SES 发信域名配置

进入 SES 控制台后,右上角区域建议选 “东京”或“新加坡”,国内访问接口速度更快。

  1. 创建身份(Identity):选 Domain,填入你的域名(如 yourdomain.com)。
  2. 设置 MAIL FROM(专业提速)
    • 展开高级设置,勾选 Use a custom MAIL FROM domain
    • 子域填 mail
    • 作用:这能消除邮件里“由亚马逊代发”的字样,极大降低被 QQ 或 Gmail 判定为垃圾邮件的概率。
  3. 关闭两个“收费陷阱”
    • Virtual Deliverability Manager:务必选 Disabled(禁用)
    • Dedicated IP:务必选 Standard(标准),不要点专用 IP。专用 IP 一个月要 24.95 美元,那是给日发百万级的巨头准备的。
  4. 解析 DNS:点击创建后,把 AWS 给你的 3 条 CNAME 记录填到你的域名解析后台。

第三阶段:终极挑战——申请“脱离沙盒”

新账号默认是“沙盒模式”,只能发给自己。要给用户发验证码,必须申请 Production Access

  • 申请位置:SES 左侧菜单 -> Account dashboard -> Request production access
  • 填写指南
    • Mail type:选 Transactional(事务性)。
    • 小作文模板
Subject: Request for SES Production Access for Website User Authentication
1. Use Case Description:
We are a startup building a [这里填你的网站类型,例如:Productivity Tool / Community Forum]. We need to use Amazon SES to send essential transactional emails, specifically:
User registration verification codes (OTP).
Password reset links.
Account security alerts.
These emails are critical for our user authentication process and account security.
2. How we collect email addresses:
We only send emails to users who voluntarily register on our website. Users provide their email addresses during the sign-up process, and we use a double opt-in mechanism to ensure the validity of the email.
3. How we handle bounces and complaints:
We have configured Amazon SES to handle bounces and complaints. We will use [Amazon SNS / Internal logs] to monitor delivery status. Any email address that results in a hard bounce or complaint will be automatically removed from our mailing list to maintain a high sender reputation.
4. Expected sending volume:
Our expected initial volume is approximately 50-100 emails per day, which is well within the standard limits.
We have already configured DKIM and SPF records for our domain to ensure maximum deliverability and security. Thank you for your review.

注意:尽量用英文,理由要正当。审核员会人工看你的网站,如果网站还没做好,起码要做个有模有样的“Coming Soon”页面。

小作文不是申请的时候填写的,是申请之后,后台会生成一个支持案例要求你回复的

image.png


第四阶段:保命设置——2 美元预算预警

AWS 最大的风险是 API 密钥泄露后,黑客拿你的号去群发广告,导致你信用卡刷爆。

  1. 搜索 Budgets 菜单。

image.png

  1. 创建预算:设置 $2.00 为每月固定预算。

image.png

  1. 配置告警
    • 实际支出达到 $1 时,发邮件给你。
    • 预测支出可能超过 $2 时,发邮件给你。
  2. 安全建议:创建 IAM 用户,只给它 AmazonSESFullAccess 权限。绝对不要把 Access Key 写死在代码里直接推送到 GitHub!

第五阶段:站长最省事建议——“动静分离”

  • 发信用 SES:按照上面的流程发验证码。
  • 收信(用户咨询)用 Cloudflare
    不要去配置 SES 的收信路由(很复杂且容易误开 50 刀的 Mail Manager)。如果你的域名在 Cloudflare,直接搜索 Email Routing,设置 support@yourdomain.com 免费转发到你的个人邮箱即可。

第五阶段:如果你想在客户端里“一眼看到并直接回复”,该怎么操作?

最省钱、最接近“正常邮箱”体验的方案是:把 SES “挂载”到你已有的常用邮箱(如 Gmail 或 QQ 邮箱)里。

第一步:设置“收件”(把信收进客户端)

使用 Cloudflare Email Routing(完全免费):

  1. support@yourdomain.com 的邮件转发到你常用的个人邮箱(比如 yourname@gmail.com)。
  2. 这样,当有人发邮件给 support@ 时,你的手机 App(已经登录了个人邮箱)会立刻弹出通知。

第二步:设置“回信”(在客户端里用 SES 发信)

你需要把 SES 的 SMTP 凭据填入你的邮箱客户端。以 Outlook(PC版)Gmail(网页版) 为例:

  1. 在客户端的设置里找到 “添加其他发件地址”“账户设置”
  2. SMTP 服务器:输入 SES 的端点(如 email-smtp.ap-northeast-1.amazonaws.com)。
  3. 端口587
  4. 用户名/密码:输入你之前下载的那个 SES SMTP 凭证
  5. 回信地址:填 support@yourdomain.com

最终效果:

  • 收信:新邮件像普通邮件一样出现在你的收件箱里。
  • 回信:你点击回复时,在“发件人”下拉菜单里选择 support@yourdomain.com。点击发送后,邮件是通过亚马逊 SES 发出的。在用户看来,你这就是一个正常的公司邮箱。

SES 的收费标准(如果你这样用的话)

这种方案的费用极低,因为你不使用亚马逊昂贵的存储服务,只使用它的流量。

  1. 发件费用 (Outbound)
    • 0.10 USD / 1,000 封邮件
    • 如果你每月回 100 封信,费用是 0.01 美元
  2. 收件费用 (Inbound)
    • 用 Cloudflare 转发,0 元
  3. 数据传输费
    • 大约 0.09 USD / GB。1,000 封邮件通常只有几十 MB,费用可以忽略不计。

总计费用: 只要你每个月的咨询量不超过几千封,你每个月的账单基本就是 0.1 美元(约 0.7 元人民币)


总结

按照这套流程:

  1. 固定支出:0 元。
  2. 按量支出:1000 封验证码 = $0.1(约 0.7 元)。
  3. 安全系数:极高(有预算预警+DMARC 验证)。

这才是个人站长和开发者最优雅、最省钱的发信姿势。


20260110更新

自动记录发信日志

如果你想让 SES 的每一封信的发件状态(成功了没、对方退信了没、有没有人投诉)都自动变成 JSON 存进 S3,最省钱且全自动的方案是:SES → Firehose → S3。
这套方案不需要写代码(不用 Lambda),且对于你每月 1000 封的量,费用几乎可以忽略不计(每月通常不到 $0.05)。

按照下面的步骤一步步操作,我为你避开了所有高额收费项。


第一步:创建一个“免费”的存储桶(S3)

S3 是 AWS 的存储服务。我们要先建一个“文件夹”来存日志。

  1. 在顶部搜索框输入 S3,点击进入。
  2. 点击橙色按钮 Create bucket(创建存储桶)。
  3. Bucket name:起个名字,比如 my-ses-logs-2026(必须全球唯一,建议加数字)。
  4. Region非常重要! 选跟你 SES 一样的区域(比如:东京 ap-northeast-1)。
  5. 其他选项全部保持默认,直接拉到最下面点 Create bucket
  6. 省钱设置(关键)
    • 点击刚建好的桶名,进到 Management(管理)选项卡。
    • 找到 Lifecycle rules(生命周期规则),点 Create lifecycle rule
    • 名字填 DeleteAfter30Days
    • 勾选 Apply to all objects in the bucket
    • 在下面勾选 Expire current versions of objects,天数填 30
    • 作用:日志存 30 天自动删除,防止由于文件堆积产生长期存储费用。

image.png

第二步:创建一个“自动搬运工”(Firehose)

SES 不能直接把日志写进 S3,需要一个叫 Firehose 的中转站。

  1. 搜索框输入 Firehose,点击进入(全称是 Amazon Data Firehose)。
  2. 点击 Create Firehose stream
  3. Source(源):选 Direct PUT
  4. Destination(目的地):选 Amazon S3
  5. Stream name:填 SES-to-S3-Stream
  6. Destination settings:选择你刚才在第一步建的那个 S3 桶。
  7. Buffer hints(避坑省钱核心)
    • 展开这个选项。
    • Buffer size:填 5 MiB。
    • Buffer interval:填 300 seconds。
    • 理由:S3 是按写入次数收钱的(一次几分钱)。这样设置会让 Firehose 每 5 分钟把这段时间的所有日志打包成一个文件存进去,而不是每一封信存一个文件,能省下 90% 的写入费。
  8. Create Firehose stream

第三步:手动创建“授权书”—— IAM 角色

步骤 1:创建角色并手动指定 SES

  1. 打开 IAM 控制台 -> 角色 (Roles) -> 创建角色 (Create role)
  2. 在“选择受信任的实体”页面,不要在列表里搜,直接选择最下方的 “自定义信任策略” (Custom trust policy)
  3. 把框里的 JSON 代码全部删掉,替换成下面这段(这段代码的作用是:明确告诉系统,这个角色是给 SES 用的):
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ses.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
  1. 点击 下一步 (Next)

步骤 2:添加权限(让它能把数据传给 Firehose)

  1. 在“添加权限”页面的搜索框输入:Kinesis
  2. 勾选 AmazonKinesisFirehoseFullAccess(这给它往任何 Firehose 管道里写数据的权限,最省事)。
  3. 点击 下一步 (Next)

步骤 3:命名并完成

  1. 角色名称 (Role name):填入 My-SES-to-S3-Log-Role
  2. 拉到最下面,点击 创建角色 (Create role)

第四步:让 SES 把日志发给搬运工(Configuration Set)

这是最关键的联结步骤。

  1. 回到 SES 控制台
  2. 左侧菜单点击 Configuration sets
  3. Create set,名字起为 LogConfig
  4. 创建后,点击这个 LogConfig 进入详情页。
  5. 找到 Event destinations 选项卡,点 Add destination
  6. Event types:把 Send, Delivery, Bounce, Complaint(发送、成功、退信、投诉)全部勾上。
  7. Destination type:选 Amazon Kinesis Data Firehose
  8. Name:随便起,如 S3Logger
  9. Delivery stream:选你刚才在第二步建的 SES-to-S3-Stream
  10. IAM role:选 Choose an existing role,下拉选你刚建的 My-SES-to-S3-Log-Role

第五步:开启“全自动”模式触发记录

注意: 如果你只是像往常一样发邮件,S3 里依然是空的。你必须在发邮件时“点名”要求使用这个 LogConfig 配置集。

这是你最需要的步骤:让 SES 自动给所有发出的信应用这条规则,而不需要你去改代码参数。

  1. 在 SES 控制台点左侧 Verified identities(已验证身份)。
  2. 点击你验证好的域名(如 zhulink.vip)。
  3. 切换到 Configuration set 选项卡,点击右侧的 Edit。
  4. Default configuration set:下拉选择刚才建的 LogConfig。
  5. 点击 Save changes。

第六步:去哪里看这些 JSON 文件?

  1. 发几封测试邮件后,等 5 分钟(因为我们设了 5 分钟缓冲)。
  2. 回到 S3 控制台,进到你的桶里。
  3. 你会看到自动生成的文件夹,路径类似:2026/01/10/12/
  4. 下载里面的 .gz 文件,解压后就是 JSON。
  5. JSON 里会有什么?
    • "eventType": "Delivery":代表发送成功。
    • "mail": { "destination": ["xxx@qq.com"] }:发送目标。
    • 如果是退信,会看到具体的错误原因(例如:mailbox full 对方邮箱满了)。

费用总结(极致省钱版)

对于你每月 1000 封信的量:

  • SES 费用:约 $0.10(基础费)。
  • Firehose 费用:Firehose 前 5GB 数据通常非常便宜,1000 封信的日志只有几百 KB,基本为 $0
  • S3 写入费:因为我们设置了 5 分钟打包一次,一个月最多只有 8000 多次写入请求,费用约为 $0.04
  • S3 存储费:因为设置了 30 天自动删除,总存储量极小,费用约为 $0.01

合计:这套自动化日志方案每个月只会让你的账单增加 约 3-4 毛钱人民币

避坑终极提醒: 只要你不去点 SES 里的“Virtual Deliverability Manager”和“Dedicated IPs”,以上配置就是 AWS 里最便宜的自动化日志方案。

已复制到剪贴板

评论 0 条

暂无评论,来种下第一颗种子。