技术解析 · 附来源的解答
SMTP 身份验证:定义与技术实现
SMTP 身份验证是一种安全机制,要求邮件客户端或应用在获准发送邮件之前,先向 SMTP 服务器证明自己的身份。它确保只有经过授权的用户才能通过该服务器路由邮件,从而防止开放中继,通常借助 AUTH 扩展使用用户名和密码完成验证。
工作流程
该过程从客户端连接服务器并发出 EHLO 命令开始。服务器返回其支持的扩展列表,其中包括 AUTH。随后,客户端选择一种身份验证机制(例如 PLAIN 或 LOGIN)并传输凭据。如果服务器根据其用户数据库验证了这些凭据,就会允许客户端发送 MAIL FROM 和 RCPT TO 命令。
对发件人的重要性
没有身份验证,服务器就成了开放中继,任何人都可以通过它发送邮件。垃圾邮件发送者会利用这个开放端口,导致 IP 很快被列入黑名单。实施 SMTP 身份验证可以确保只有正当的应用才能发送邮件,这是保持良好发件人信誉、确保邮件不被收件邮件服务器拒收的基本要求。
运维说明与常见错误
一个常见错误是通过未加密的连接发送凭据。为防止凭据被窃取,身份验证应始终与 STARTTLS 或隐式 TLS 配合使用。另一个常见问题是使用了现代服务商已不再支持的过时身份验证方法。开发者可以使用 SendHQ 免费工具(https://sendhq.cc/tools)验证其 DNS 和身份验证配置。
具体实现示例
在使用 smtplib 的典型 Python 实现中,开发者连接到 587 端口,调用 starttls() 保护连接,然后调用 login(user, password)。这一顺序确保在服务器接受邮件并将其投递到最终目的地之前,身份已通过加密通道得到验证。
身份验证方法
最常见的方法包括 PLAIN 和 LOGIN:PLAIN 以近似明文的格式(Base64)发送密码,LOGIN 则是旧版客户端使用的传统方法。现代系统通常更倾向于使用 OAuth2 进行 SMTP 身份验证,让应用使用令牌而非固定密码,从而降低凭据在配置文件中泄露的风险。
团队常问的问题
SMTP 身份验证和 SPF 或 DKIM 是一回事吗?
不是。SMTP 身份验证是在发送过程中由服务器验证客户端。SPF 和 DKIM 则是在邮件发出后,由收件服务器验证发件人。
经过身份验证的 SMTP 通常使用哪个端口?
587 端口是结合身份验证和 STARTTLS 提交邮件的标准端口,而 465 端口用于隐式 TLS。
如果 SMTP 身份验证失败会怎样?
服务器会返回 535 Authentication Failed 错误码并拒收邮件,使其无法进入队列或被投递。
一手资料
- RFC 4954:SMTP 身份验证服务扩展 — RFC Editor
- RFC 3207:基于传输层安全(TLS)的安全 SMTP 服务扩展 — RFC Editor
- 服务名称与传输协议端口号注册表 — IANA