介绍
SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)是一种用于发送电子邮件的标准通信协议。
SMTP 的作用
- 任何邮件客户端(Gmail、Outlook、Thunderbird)要发邮件,都要连接一个 SMTP 服务器。
- 如果你用 Gmail 自带的发信通道,它走的是 Google 的 smtp.gmail.com。
- 如果你想发出的是 support@yourdomain.com,你就需要自己或第三方提供的 SMTP 服务器。
SMTP 是电子邮件系统的**“邮递员”**。 它主要负责:
- 把邮件从发件人设备传输到邮件服务器;
- 再由邮件服务器转发到收件人所在的服务器。
例如:
当你在 Gmail 里发邮件时,Gmail 会使用 SMTP 把邮件发送到对方的邮箱服务器(如 Outlook、QQ 邮箱等)。
应用场景
邮箱客户端发信
| 场景 | 比喻 |
|---|---|
| 你用 Outlook 发信 | 自己去邮局寄信(你负责邮寄过程) |
| 你用 Gmail 网页发信 | 你交给秘书(浏览器),秘书帮你到邮局(SMTP 服务器)寄信 |
第三方邮箱代发
- 你的网站或程序(客户端)连接到 Gmail 的 SMTP 服务器(smtp.gmail.com)。
- 通过身份验证(邮箱地址 + 密码或 App 专用密码)。
- 把邮件内容(收件人、标题、正文等)发送给 Gmail。
- Gmail 再代表你去和收件人邮箱服务器(比如 QQ 邮箱、Outlook)通信。
- 最终,收件人看到邮件的发件地址是你自己的域名邮箱(如 info@mydomain.com)。
✉️ 实际发送流程:
- 你点“发送”;
- Gmail 登录 smtp.gmail.com(凭你的 Gmail 身份);
- 邮件被 Gmail 的服务器送出;
- 邮件头(Header)中会写明真实来源;
- 收件人虽然看到的发件人是 support@myapp.com,
- 但技术上,这封信仍是从 Gmail 发出的。
基本流程
流程图
|
|
建立连接:发件人邮件客户端与邮件服务器通过 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,必须专门生成。
- 登录 AWS 控制台,进入 Amazon SES 页面。
- 在左侧菜单栏点击 SMTP Settings (SMTP 设置)。
- 记下服务器地址:例如
email-smtp.us-east-1.amazonaws.com(取决于你选的区域)。 - 点击 Create SMTP credentials (创建 SMTP 凭证) 按钮。
- 可以修改 IAM 用户名(或保持默认),点击“创建”。
- 点击 “Show User SMTP Security Credentials”,或者下载 CSV 文件。
- SMTP Username:一串长字符。
- SMTP Password:另一串长字符。
- 一定要保存好,这页面关了就看不到了。
Step:在 Gmail 中配置发信 (Send Mail As)
既然你用 Cloudflare 路由收信(最终转发到 Gmail),我们就在同一个 Gmail 里配置发信。
- 打开你的 Gmail 网页版。
- 设置 (齿轮) -> 查看所有设置 -> 账号和导入。
- 在“使用其他电子邮件地址发送邮件”栏,点击 添加其他电子邮件地址。
- 填写信息:
- 名称:IdeaToImg Support (客户看到的发件人名字)。
- 电子邮件地址:
support@example.com。 - 取消勾选“作为别名处理” (建议取消,这样回信头信息更清晰)。
- 点击“下一步”。
- 填写 SMTP 服务器信息 (使用第一步获取的数据):
- SMTP 服务器:例如
email-smtp.us-east-1.amazonaws.com。 - 端口:587 (推荐) 或 465。
- 用户名:刚才获取的
SMTP Username。 - 密码:刚才获取的
SMTP Password。 - 加密连接:选择 TLS (如果端口是 587) 或 SSL (如果端口是 465)。
- SMTP 服务器:例如
- 点击 添加账号。
- 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):
|
|
注意:不要添加两条 SPF 记录,必须合并在一条里。
2. 配置 DKIM (如果你还没配)
在 AWS SES 控制台的 Identities -> 点击你的域名 -> DKIM 部分。 AWS 会给你 3 个 CNAME 记录。请务必将这 3 个 CNAME 添加到 Cloudflare 的 DNS 记录中。
- 这就像给你的邮件盖了公章,能极大提高进入收件箱的概率。