SMTP 配置是指设置您的邮件服务器(或电子邮件客户端)以便使用简单邮件传输协议正确发送消息的过程。配置得当,您的邮件就会进入收件箱。配置不当,您将面临投递失败、身份验证错误,或邮件悄悄进入垃圾文件夹的问题。每次都需要做对的三件事是:使用正确的端口、正确的加密方法,以及可用的身份验证凭证。
目录
SMTP 的实际作用
SMTP 是您的电子邮件客户端或应用程序用来将传出消息交给邮件服务器的协议,邮件服务器随后将其路由到收件人。它只处理发送端。接收电子邮件由独立的协议处理:IMAP(用于同步)或 POP3(用于下载)。
当您点击"发送"时,您的客户端打开到 SMTP 服务器的 TCP 连接,进行身份验证,交付消息,然后断开连接。服务器随后尝试使用相同的协议将该消息投递到收件人的邮件服务器,通过查询目标的 MX(邮件交换)DNS 记录来找到发送位置。
SMTP 在 RFC 5321 中定义,它取代了原始的 RFC 2821。理解该规范有助于您在需要调试原始 SMTP 会话或从头配置服务器时排查问题。
SMTP 端口详解:25、465 和 587
在任何 SMTP 配置中,您会遇到三个端口。每个端口都有特定的作用,使用错误的端口是导致电子邮件投递失败的最常见原因之一。
| 端口 | 名称 | 加密方式 | 典型用途 |
|---|---|---|---|
| 25 | SMTP | 无(或 STARTTLS) | 服务器到服务器中继(MTA 到 MTA) |
| 465 | SMTPS | 隐式 SSL/TLS | 遗留客户端提交(较旧的应用) |
| 587 | 提交 | STARTTLS(显式 TLS) | 经过身份验证的客户端电子邮件提交 |
端口 25 与 587 的对比:应该使用哪一个
端口 25 是原始的 SMTP 端口,早在 1982 年就已定义。它的设计初衷是供邮件服务器相互通信,而不是供最终用户提交邮件。大多数互联网服务提供商和云提供商会特意从住宅和共享托管 IP 阻止出站端口 25,以防止垃圾邮件。如果您运行的应用程序需要发送电子邮件,尝试使用端口 25 几乎肯定会失败。
端口 587 是从客户端或应用程序提交电子邮件的正确选择。它在 RFC 6409 中被标准化为专门的"消息提交"端口。它需要 STARTTLS,这意味着连接以未加密的方式启动,然后在发送任何凭证之前升级到 TLS。这是 Gmail、Outlook 和几乎所有现代电子邮件提供商期望您使用的方式。
SMTP 端口 465:SSL 遗留端口
端口 465 有一段不寻常的历史。它在 1997 年被短暂分配给 SMTPS(SMTP over SSL),然后在 1998 年该分配被撤销,当时 STARTTLS on port 587 成为了首选方法。尽管在官方上已被弃用,许多邮件服务器仍然继续支持它,后来它被 IANA 重新注册用于不同的目的。
在实践中,大多数提供商仍然接受使用隐式 SSL/TLS 的端口 465 上的连接。这意味着 TLS 从第一个字节开始就包装整个连接,而不是像 STARTTLS 那样在握手中间升级。某些较旧的应用程序和硬件(某些网络打印机、遗留 CRM)仅支持端口 465,因此在这些情况下它仍然有用。
- 如果您的应用程序或设备特别需要隐式 SSL 且无法进行 STARTTLS,请使用端口 465。
- 对于其他所有情况,请使用端口 587。它是现代标准。
- 完全避免使用端口 25 进行客户端提交。
SMTP 身份验证:工作原理
SMTP 身份验证(通常写作 SMTP AUTH)在 RFC 4954 中定义。它要求客户端在服务器接受出站邮件之前证明其身份。没有它,任何能够到达您的服务器的人都可以使用它来发送垃圾邮件,这就是为什么开放中继被视为严重的安全问题。
您在 SMTP 配置中最常见的身份验证机制是:
- PLAIN: 发送 base64 编码的用户名和密码。仅在加密连接上安全(必须首先激活 TLS)。
- LOGIN: 类似于 PLAIN,但将用户名和密码作为单独的交换发送。也需要 TLS。
- CRAM-MD5: 一种质询-响应机制,避免直接发送密码。在现代服务器上不太常见。
- XOAUTH2: 由 Gmail 和其他 Google Workspace 帐户使用。您提供 OAuth 2.0 访问令牌而不是密码。这是当"不太安全的应用访问"被禁用时需要的。
邮件服务器设置分步指南
无论您是配置 Thunderbird 等电子邮件客户端、发送事务电子邮件的 Web 应用程序,还是自托管邮件服务器,该过程都遵循相同的逻辑序列。
对于电子邮件客户端和应用程序
-
从您的提供商获取 SMTP 主机名。
示例:
smtp.gmail.com、smtp.office365.com、mail.yourdomain.com。 - 选择正确的端口。 默认情况下使用 587 和 STARTTLS。如果您的应用需要,回退到 465 和 SSL。
- 输入您的身份验证凭证。 这通常是您的完整电子邮件地址作为用户名,加上您的密码或应用密码。
- 设置加密方法。 将其与端口匹配:587 使用 STARTTLS,465 使用 SSL/TLS。
- 测试连接。 大多数电子邮件客户端都有"测试帐户设置"或"验证"按钮。在保存之前使用它。
对于自托管邮件服务器(Postfix 示例)
如果您使用 Postfix 运行自己的服务器,核心 SMTP 配置位于
/etc/postfix/main.cf
。以下是通过第三方 SMTP 提供商进行中继的最小工作示例:
# /etc/postfix/main.cf - Basic relay configuration
relayhost = [smtp.sendgrid.net]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = encrypt
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
smtp_use_tls = yes
编辑后,创建
/etc/postfix/sasl_passwd
并输入您的凭证,运行
postmap /etc/postfix/sasl_passwd
对其进行哈希,然后使用
systemctl reload postfix
重新加载 Postfix。
chmod 600 /etc/postfix/sasl_passwd
和
chmod 600 /etc/postfix/sasl_passwd.db
。可读的凭证文件是常见的服务器配置错误。
常见邮件服务商的 SMTP 设置
| 服务商 | SMTP 主机 | 端口 | 加密方式 | 身份验证说明 |
|---|---|---|---|---|
| Gmail | smtp.gmail.com | 587 | STARTTLS | 使用应用密码或 OAuth2 |
| Gmail(备用) | smtp.gmail.com | 465 | SSL/TLS | 使用应用密码或 OAuth2 |
| Microsoft 365 | smtp.office365.com | 587 | STARTTLS | 现代身份验证 / 应用密码 |
| Yahoo Mail | smtp.mail.yahoo.com | 465 | SSL/TLS | 需要应用密码 |
| Zoho Mail | smtp.zoho.com | 587 | STARTTLS | 完整电子邮件作为用户名 |
| Amazon SES | email-smtp.us-east-1.amazonaws.com | 587 | STARTTLS | IAM SMTP 凭证 |
SMTP 连接问题排查
大多数 SMTP 失败都属于少数几个类别。在深入查看日志之前,请检查该端口是否确实可以从您的服务器或网络到达。防火墙或互联网服务提供商阻止通常是罪魁祸首,您可以在没有任何特殊工具的情况下快速确认。
您可以使用免费的在线端口检查工具来验证您的邮件服务器上的 SMTP 端口是否打开。输入您的邮件服务器的主机名或 IP,选择端口 25、465 或 587,然后运行测试。如果结果显示已关闭或超时,问题是网络级别(防火墙、互联网服务提供商阻止或服务未运行),而不是您的应用程序内的配置错误。
常见错误消息及其含义
- 连接被拒绝 / 连接超时: 端口被阻止或服务未监听。检查您的防火墙规则,并确认 SMTP daemon 正在运行。
- 535 身份验证失败: 用户名或密码错误。对于 Gmail,这通常意味着您需要应用密码,而不是您的帐户密码。
- 550 5.7.1 中继访问被拒绝: 您的服务器未配置为中继该发件人地址的邮件,或在 MAIL FROM 命令之前未进行身份验证。
- 421 连接过多: 接收服务器正在对您进行速率限制。减少发送频率或实现带有延迟的队列。
- TLS 握手失败: 证书不匹配或 TLS 版本过时。检查您的服务器的 SSL 证书是否有效,并且您没有尝试使用大多数提供商已禁用的 TLS 1.0 或 1.1。
快速诊断清单
- 确认 SMTP 端口从您的发送环境打开且可到达。
-
使用
nslookup smtp.yourdomain.com验证主机名是否正确解析。 - 使用 MXToolbox 黑名单检查 等工具检查您的发送 IP 是否在黑名单上。
- 确认您的 SPF、DKIM 和 DMARC DNS 记录已正确发布。缺少或损坏的记录会导致合法邮件被拒绝或进入垃圾文件夹。
-
查看您的邮件服务器日志。对于 Postfix,检查
/var/log/mail.log。日志中的实际 SMTP 响应代码会准确告诉您远程服务器拒绝了什么以及原因。
您的 SMTP 端口真的打开了吗?
在责怪您的 SMTP 配置之前,请确认问题不是被阻止的端口。我们的免费端口检查工具让您可以立即在任何邮件服务器上测试端口 25、465 或 587,因此您知道您是在处理防火墙问题还是配置错误。
立即检查您的 SMTP 端口 →
端口 465 使用隐式 SSL/TLS,这意味着从一开始整个连接都被加密。端口 587 使用 STARTTLS,它以纯连接开始,然后在发送凭证之前升级到 TLS。正确配置时,两者都是安全的,但端口 587 是推荐用于客户端电子邮件提交的现代标准。只有当您的应用程序特别需要隐式 SSL 且无法支持 STARTTLS 时,才使用 465。
端口 25 在大多数住宅和共享托管网络上被阻止,因为它在历史上被用于直接从受感染的机器发送垃圾邮件。通过阻止出站端口 25,互联网服务提供商和云提供商(包括默认情况下的 AWS EC2)防止其 IP 范围被用作垃圾邮件来源。对于从应用程序发送电子邮件,请使用端口 587。如果您运行需要端口 25 打开以进行服务器到服务器中继的合法邮件服务器,您通常需要向您的提供商请求解除阻止。
在大多数情况下,您的 SMTP 用户名是您的完整电子邮件地址,例如
you@yourdomain.com
。某些较旧的系统只使用 @ 符号之前的本地部分。对于 Amazon SES 等服务,用户名是单独生成的 IAM SMTP 凭证,根本不是您的电子邮件地址。始终查看您的特定提供商的文档。当在启用了双因素身份验证的 Gmail 或 Outlook 中使用时,您需要生成应用专用密码,而不是使用您的常规帐户密码。
您可以在多个级别进行测试。首先,使用端口检查工具或从您的服务器运行
telnet smtp.yourdomain.com 587
来检查 SMTP 端口是否可到达。如果端口打开,您可以使用
openssl s_client -starttls smtp -connect smtp.yourdomain.com:587
测试完整的 SMTP 握手,它显示 TLS 证书并让您键入原始 SMTP 命令。对于完整的端到端测试而不投递到真实收件箱,请使用 Mailtrap 等服务,它接受 SMTP 连接并显示消息而不转发它。
成功的 SMTP 身份验证只证明您被允许使用该服务器。垃圾邮件过滤发生在接收端,基于多种因素:您的发送 IP 是否在黑名单上、您的 SPF 记录是否授权该 IP 为您的域发送、您的 DKIM 签名是否有效并与您的 DNS 记录匹配,以及您的 DMARC 策略是否已发布。仅缺少或损坏的 SPF 记录就足以导致 Gmail 或 Outlook 将您的消息放入垃圾文件夹。检查所有三个 DNS 记录并验证您的发送 IP 的信誉。
可以,但有限制。Gmail 的 SMTP 服务器(
smtp.gmail.com
在端口 587 上)将邮件作为您的 Gmail 帐户进行身份验证和发送。如果您想让"发件人"地址显示您的自定义域,您需要在 Gmail 的设置中的"以...身份发送"下添加该地址并验证所有权。但是,Gmail 在某些电子邮件客户端中可见的"通过 gmail.com 发送"注释。为了更干净的设置和您自己的域,使用 Amazon SES 或专门的 SMTP 中继等事务电子邮件提供商是更好的长期选择。