SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)是用于发送电子邮件的核心协议,属于 TCP/IP 协议族的一部分。它负责将邮件从客户端传递到邮件服务器,并在服务器之间转发邮件。
1. SMTP 的核心特点
特性 | 说明 |
---|---|
用途 | 发送邮件(与 POP3/IMAP 配合使用,后者用于接收)。 |
默认端口 | 25(明文) / 465(SSL/TLS) / 587(STARTTLS) |
协议模式 | 文本协议(基于命令-响应)。 |
传输方式 | 默认不加密(25端口),推荐使用 SMTPS(465) 或 STARTTLS(587)。 |
对比 HTTP | SMTP 专为邮件设计,而 HTTP 是通用协议(如 Web 邮件)。 |
2. SMTP 工作原理
(1)连接与握手
-
客户端(如 Outlook)连接邮件服务器的 25/465/587 端口。
-
服务器返回 220 状态码(服务就绪)。
-
客户端发送
EHLO
(或HELO
)表明身份:bash
复制
下载
EHLO example.com
-
服务器返回支持的功能(如
STARTTLS
、AUTH
)。
(2)邮件传输流程
命令 | 功能 | 示例 |
---|---|---|
MAIL FROM: | 发件人地址 | MAIL FROM:<sender@example.com> |
RCPT TO: | 收件人地址 | RCPT TO:<recipient@example.org> |
DATA | 开始传输邮件内容 | DATA → 输入邮件头 + 正文 + . 结束 |
QUIT | 关闭连接 | QUIT |
(3)完整交互示例
bash
复制
下载
S: 220 smtp.example.com ESMTP Postfix C: EHLO client.example.com S: 250-smtp.example.com S: 250-STARTTLS S: 250-AUTH LOGIN PLAIN S: 250 8BITMIME C: MAIL FROM:<sender@example.com> S: 250 OK C: RCPT TO:<recipient@example.org> S: 250 Accepted C: DATA S: 354 Enter message, end with "." on a line by itself C: From: sender@example.com C: To: recipient@example.org C: Subject: Test Email C: C: Hello, this is a test email. C: . S: 250 OK: queued as ABC123 C: QUIT S: 221 Bye
3. SMTP 端口与加密
端口 | 加密 | 用途 |
---|---|---|
25 | ❌ 明文 | 传统 SMTP(可能被 ISP 拦截)。 |
465 | ✅ SSL/TLS(SMTPS) | 加密传输(推荐)。 |
587 | ✅ STARTTLS(升级加密) | 现代标准(先明文,后加密)。 |
⚠️ 注意:
端口 25 通常用于服务器间转发(MTA→MTA)。
客户端提交邮件(MUA→MTA)建议使用 587(STARTTLS) 或 465(SMTPS)。
4. SMTP 认证机制
为防止垃圾邮件,SMTP 服务器通常要求认证:
-
AUTH LOGIN
-
用户名和密码 Base64 编码:
bash
复制
下载
AUTH LOGIN 334 VXNlcm5hbWU6 # Username: dXNlckBleGFtcGxlLmNvbQ== # user@example.com 334 UGFzc3dvcmQ6 # Password: cGFzc3dvcmQxMjM= # password123
-
-
AUTH PLAIN
-
直接发送
用户名\0密码
的 Base64 编码:bash
复制
下载
AUTH PLAIN AHVzZXJAZXhhbXBsZS5jb20AcGFzc3dvcmQxMjM=
-
-
CRAM-MD5(更安全,但较少使用)。
5. SMTP 服务器软件
名称 | 特点 |
---|---|
Postfix | 轻量、安全,广泛用于 Linux。 |
Exim | 高度可定制(Debian 默认)。 |
Sendmail | 老牌但配置复杂。 |
Microsoft Exchange | 企业级,支持 SMTP/IMAP/ActiveSync。 |
6. SMTP 与邮件头
邮件头(Headers)包含元数据,例如:
复制
下载
From: sender@example.com To: recipient@example.org Subject: Test Date: Mon, 01 Jan 2024 12:00:00 +0000 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8
📌 关键头字段:
From
、To
、Subject
、Date
、Message-ID
。
7. 测试 SMTP 连接
(1)使用 Telnet(明文)
bash
复制
下载
telnet smtp.example.com 25 EHLO client.example.com MAIL FROM:<sender@example.com> RCPT TO:<recipient@example.org> DATA ...输入邮件内容... . QUIT
(2)使用 OpenSSL(加密)
bash
复制
下载
openssl s_client -connect smtp.example.com:465 -quiet EHLO client.example.com AUTH LOGIN ...输入Base64编码的用户名和密码... MAIL FROM:<sender@example.com> ...
8. 常见问题
(1)邮件被拒绝
-
错误:
550 5.7.1 Relaying denied
-
原因:SMTP 服务器未允许你的 IP 或认证失败。
-
解决:检查认证配置或使用正确的
MAIL FROM
域名。
-
(2)连接超时
-
检查防火墙是否放行 25/465/587 端口。
-
确保 DNS MX 记录指向正确的邮件服务器。
(3)垃圾邮件过滤
-
配置 SPF、DKIM、DMARC 以提高邮件可信度。
9. 安全建议
-
始终使用加密(465 或 587 端口)。
-
禁用匿名发送(防止垃圾邮件)。
-
配置 SPF/DKIM 防止伪造。
总结
-
SMTP 用于发送邮件,POP3/IMAP 用于接收。
-
加密端口:465(SMTPS)、587(STARTTLS)。
-
认证方式:
AUTH LOGIN
、AUTH PLAIN
。 -
测试工具:
telnet
、openssl s_client
。
如果需要配置 Postfix/Exim 或解决发送问题,可以进一步说明!