介绍

SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)是一种用于发送电子邮件的标准通信协议。

SMTP 的作用

  • 任何邮件客户端(Gmail、Outlook、Thunderbird)要发邮件,都要连接一个 SMTP 服务器。
  • 如果你用 Gmail 自带的发信通道,它走的是 Google 的 smtp.gmail.com。
  • 如果你想发出的是 support@yourdomain.com,你就需要自己或第三方提供的 SMTP 服务器。

SMTP 是电子邮件系统的**“邮递员”**。 它主要负责:

  1. 把邮件从发件人设备传输到邮件服务器;
  2. 再由邮件服务器转发到收件人所在的服务器。

例如:

当你在 Gmail 里发邮件时,Gmail 会使用 SMTP 把邮件发送到对方的邮箱服务器(如 Outlook、QQ 邮箱等)。

应用场景

邮箱客户端发信

场景 比喻
你用 Outlook 发信 自己去邮局寄信(你负责邮寄过程)
你用 Gmail 网页发信 你交给秘书(浏览器),秘书帮你到邮局(SMTP 服务器)寄信

第三方邮箱代发

  1. 你的网站或程序(客户端)连接到 Gmail 的 SMTP 服务器(smtp.gmail.com)。
  2. 通过身份验证(邮箱地址 + 密码或 App 专用密码)。
  3. 把邮件内容(收件人、标题、正文等)发送给 Gmail。
  4. Gmail 再代表你去和收件人邮箱服务器(比如 QQ 邮箱、Outlook)通信。
  5. 最终,收件人看到邮件的发件地址是你自己的域名邮箱(如 info@mydomain.com)。

✉️ 实际发送流程:

  1. 你点“发送”;
  2. Gmail 登录 smtp.gmail.com(凭你的 Gmail 身份);
  3. 邮件被 Gmail 的服务器送出;
  4. 邮件头(Header)中会写明真实来源;
  5. 收件人虽然看到的发件人是 support@myapp.com
  6. 但技术上,这封信仍是从 Gmail 发出的。

基本流程

流程图

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
┌──────────────┐        ┌──────────────────┐        ┌────────────────┐
│ 你的程序/网站 │  SMTP  │  发信SMTP服务器   │  SMTP  │  收件人邮箱服务器 │
│ (sendEmail)   ├───────►│ (如 Amazon SES)  ├───────►│ (如 Gmail)      │
└──────┬───────┘        └────────┬─────────┘        └───────┬────────┘
       │                         │                          │
       │ 1 buildMessage()        │                          │
       │   (From/To/Subject/Body)│                          │
       │ 2 connect()             │                          │
       │ 3 auth()                │                          │
       │ 4 sendData()            │                          │
       │ 5 queueAndRelay()       │                          │
       │                         │ 6 deliverInboxOrSpam()   │
       │                         │                          │

建立连接:发件人邮件客户端与邮件服务器通过 TCP(通常是端口 25、465 或 587)建立连接。

这是邮件客户端(比如 Outlook、Gmail、或者你的网站程序)与邮件服务器之间的“握手”过程。

  • 它使用 TCP 协议(一种可靠的网络通信方式);
  • 通常连接到服务器的 SMTP 端口(如 465 或 587);
  • 类似你打电话前先拨号接通。

📍 举例: 当你点击“发送邮件”,电脑会和 Gmail 的服务器(smtp.gmail.com)建立连接。

身份验证:服务器验证发件人的身份(SMTP AUTH)。

服务器要确认:

“你是不是有权限从这个邮箱发送邮件?”

这一步是为了防止垃圾邮件或伪造发件人。

  • 一般需要提供用户名(邮箱地址)和密码;
  • Gmail 等服务使用 App 专用密码(不是你的登录密码)。

传输邮件:客户端将邮件内容发送到服务器。

当身份验证通过后,客户端开始真正“寄信”:

  • 邮件分成三部分:发件人(From)、收件人(To)、正文(Body);
  • SMTP 用一系列命令(如 MAIL FROM:、RCPT TO:、DATA)告诉服务器怎么处理。

📍 举例: 就像你在邮局写信地址、贴邮票、投信箱。

转发与投递:服务器将邮件转发给目标服务器或直接投递给收件人。

服务器拿到信后,检查收件人的地址:

  • 如果收件人在同一个服务器上(例如两个 Gmail 用户),直接投递;
  • 如果是不同服务器(例如发 Gmail 到 Outlook),SMTP 会转发到 Outlook 的邮件服务器。

📍 举例: 就像邮局把信交给另一个城市的邮局,再由那边送达。

结束会话:服务器关闭连接。

邮件传输完毕后,客户端告诉服务器:

“我发完了,可以断开连接了。” 命令是 QUIT。 服务器回应“再见”,然后关闭连接。

📍 举例: 就像打完电话说“拜拜”,挂断通话。

配置 SMTP 时候的安全性的配置

  • SPF / DKIM / DMARC 不是“发邮件的协议”,而是“邮件的防伪验真规则”。
  • 它们本质上是基于 DNS 的身份验证体系,不是只能绑死在 SMTP 上。
  • 实际上是专门为 SMTP(邮件传输协议)生态系统“打补丁”而发明的,它们只能用于电子邮件领域。

发件人策略框架 / SPF / Sender Policy Framework

我在 DNS 里声明:哪些服务器允许代表我域名发信。

专注:谁能用我名义发

它怎么工作(直观)

收件方会看“这封邮件从哪个 IP 发来的”,再去 DNS 查你的 SPF:

  • 如果 IP 在你允许列表里 → SPF pass
  • 不在 → SPF fail(可能是伪造)

域名密钥识别邮件/ DKIM / DomainKeys Identified Mail

防止邮件内容篡改和解决邮件转发问题。 专注:这封邮件是不是我签的、有没有被改。

基于域的消息认证,报告和一致 / DMARC / Domain-based Message Authentication, Reporting, and Conformance

我告诉收件方:SPF/DKIM 验证不过的“冒充邮件”要怎么处理,并把统计报告发给我。 它做了两件事

制定处理策略:none(观察)/ quarantine(隔离)/ reject(拒收)

要求对齐:骗子常常“表面 From 像你”,但 SPF/DKIM 用的是别的域;DMARC 要求“证件名字要和你一致”,否则算失败。

典型应用场景

  • 你有品牌域名(比如 example.com),不想被冒充 → 上 DMARC,最终走到 reject
  • 你发信渠道多(SES + Gmail + 工单系统 + 营销平台),想知道谁在用你域名发 → 用 p=none 收报告排查
  • 企业客户收信很严格 → DMARC 能提高“企业级可投递性”

配置 AWS SES SMTP 凭证

注意: SMTP 的账号密码不是你的 AWS 登录密码,也不是普通的 IAM Access Key,必须专门生成。

  1. 登录 AWS 控制台,进入 Amazon SES 页面。
  2. 在左侧菜单栏点击 SMTP Settings (SMTP 设置)。
  3. 记下服务器地址:例如 email-smtp.us-east-1.amazonaws.com (取决于你选的区域)。
  4. 点击 Create SMTP credentials (创建 SMTP 凭证) 按钮。
  5. 可以修改 IAM 用户名(或保持默认),点击“创建”。
  6. 点击 “Show User SMTP Security Credentials”,或者下载 CSV 文件。
    • SMTP Username:一串长字符。
    • SMTP Password:另一串长字符。
    • 一定要保存好,这页面关了就看不到了。

Step:在 Gmail 中配置发信 (Send Mail As)

既然你用 Cloudflare 路由收信(最终转发到 Gmail),我们就在同一个 Gmail 里配置发信。

  1. 打开你的 Gmail 网页版。
  2. 设置 (齿轮) -> 查看所有设置 -> 账号和导入
  3. 在“使用其他电子邮件地址发送邮件”栏,点击 添加其他电子邮件地址
  4. 填写信息
    • 名称:IdeaToImg Support (客户看到的发件人名字)。
    • 电子邮件地址support@example.com
    • 取消勾选“作为别名处理” (建议取消,这样回信头信息更清晰)。
    • 点击“下一步”。
  5. 填写 SMTP 服务器信息 (使用第一步获取的数据):
    • SMTP 服务器:例如 email-smtp.us-east-1.amazonaws.com
    • 端口587 (推荐) 或 465。
    • 用户名:刚才获取的 SMTP Username
    • 密码:刚才获取的 SMTP Password
    • 加密连接:选择 TLS (如果端口是 587) 或 SSL (如果端口是 465)。
  6. 点击 添加账号
  7. Gmail 会发一封验证邮件给 support@example.com
    • 因为你配置了 Cloudflare 路由,这封信会转回你的 Gmail 收件箱。
    • 点开邮件,点击验证链接,或复制验证码填入。

Step 修正回复逻辑

当前 (Current): 🔘 Always reply from default address… 改为 (Change to): 🔘 Reply from the same address the message was sent to 逻辑:这是实现“无缝体验”的关键。勾选这个后,当客户发给 support@ 时,你点击回复,Gmail 会自动切换发件人为 support@ (走 AWS 通道);朋友发给你私人邮箱时,自动切换回私人邮箱。


Step:配置 DNS (防止进垃圾箱)

这是最关键的一步。因为你同时用了 Cloudflare (收)AWS (发),你的 SPF 记录必须同时包含这两者。

请去 Cloudflare 的 DNS 设置页面检查你的 TXT 记录。

1. 修改 SPF 记录

你现在的 SPF 记录可能长这样(Cloudflare 自动生成的): v=spf1 include:_spf.mx.cloudflare.net ~all

你需要把它修改为(合并 AWS):

1
v=spf1 include:_spf.mx.cloudflare.net include:amazonses.com ~all

注意:不要添加两条 SPF 记录,必须合并在一条里。

2. 配置 DKIM (如果你还没配)

在 AWS SES 控制台的 Identities -> 点击你的域名 -> DKIM 部分。 AWS 会给你 3 个 CNAME 记录。请务必将这 3 个 CNAME 添加到 Cloudflare 的 DNS 记录中。

  • 这就像给你的邮件盖了公章,能极大提高进入收件箱的概率。