Skip to content
上一页

在 Debian 13 上通过 Telnet 手动连接 SMTP 服务器发送邮件

0x00 前言

在日常工作中,我们通常使用邮件客户端 (如 Thunderbird) 来发送邮件,但了解底层的邮件传输机制对于排查邮件问题、理解邮件协议至关重要。本文将详细讲解如何使用 telnet 手动连接到邮件服务器的 25 端口,并通过 SMTP 协议发送一封完整的邮件。

0x01 什么是 SMTP

SMTP (Simple Mail Transfer Protocol) 是一种用于传输电子邮件的互联网标准协议。它定义了邮件客户端如何将邮件提交给邮件服务器,以及邮件服务器之间如何相互传递邮件。

SMTP 默认使用 TCP 25 端口进行通信 (未加密),或使用 587 端口 (提交端口,通常需要认证)。

0x02 环境准备

本次操作使用的环境信息:

确保你的系统已安装 telnet 客户端。如果没有,可以通过以下命令安装:

Terminal window
# Ubuntu/Debian
sudo apt-get install telnet
# CentOS/RHEL
sudo yum install telnet
# macOS (通常已预装)
brew install telnet

0x03 动手实验

连接到邮件服务器

首先,使用 telnet 命令连接到邮件服务器的 25 端口:

Terminal window
telnet mail.w 25

如果连接成功,你将看到服务器的欢迎信息:

Trying 192.168.1.100...
Connected to mail.w.
Escape character is '^]'.
220 mail.w ESMTP Postfix

220 响应码 表示服务就绪。SMTP 使用三位数字的响应码来指示命令执行状态,2xx 表示成功,3xx 表示需要更多信息,4xx 表示临时错误,5xx 表示永久错误。

发送 EHLO 命令

接下来,向服务器标识自己的身份。使用 EHLO(Extended HELLO) 命令:

EHLO client.example.com

服务器会返回它支持的扩展功能:

250-mail.w
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-DSN
250 SMTPUTF8

EHLO 是 SMTP 协议的扩展版本命令,用于标识客户端并查询服务器支持的功能。传统的 HELO 命令仍然可用,但 EHLO 提供了更多功能支持。

注意: EHLO 后面的域名可以是你的主机名或任意有效域名,主要用于日志记录和身份标识。

指定发件人地址

使用 MAIL FROM 命令指定邮件的发件人:

MAIL FROM:<alice@mail.w>

服务器确认:

250 2.1.0 Ok

MAIL FROM 命令用于指定邮件的”信封发件人”(envelope sender),这与邮件头部的 From 字段可能不同。信封发件人主要用于退信处理。

指定收件人地址

使用 RCPT TO 命令指定邮件的收件人:

RCPT TO:<bob@mail.w>

服务器确认:

250 2.1.5 Ok

如果需要发送给多个收件人,可以多次执行 RCPT TO 命令:

RCPT TO:<bob@mail.w>
RCPT TO:<charlie@mail.w>
RCPT TO:<diana@mail.w>

每个收件人都会收到服务器的确认响应。

开始输入邮件内容

使用 DATA 命令告诉服务器准备接收邮件内容:

DATA

服务器响应:

354 End data with <CR><LF>.<CR><LF>

354 响应码 表示服务器准备好接收邮件数据。邮件内容必须以单独一行的英文句点结束。

输入邮件头和正文

现在可以输入完整的邮件内容,包括邮件头 (Headers) 和正文 (Body)。邮件头和正文之间需要一个空行分隔。

From: Alice <alice@mail.w>
To: Bob <bob@mail.w>
Subject: Test Email via Telnet
Date: Mon, 1 Dec 2025 10:30:00 +0800
Message-ID: <20251201103000.12345@mail.w>
Hello Bob,
This is a test email sent manually using telnet and SMTP protocol.
This demonstrates how email transmission works at the protocol level.
Best regards,
Alice
.

重要提示:

服务器确认邮件已接收:

250 2.0.0 Ok: queued as A1B2C3D4E5

Message-ID 是邮件的唯一标识符,格式通常为 <本地部分@域名>。虽然可以手动指定,但邮件服务器通常会自动生成。

结束会话

使用 QUIT 命令断开连接:

QUIT

服务器响应:

221 2.0.0 Bye
Connection closed by foreign host.

0x04 注意事项

中继被拒绝 (Relay Access Denied)

如果收到 “554 Relay access denied” 错误,说明服务器不允许你转发邮件。

邮件被退回

如果邮件发送成功但随后被退回,检查:

  1. 收件人邮箱是否存在
  2. 收件人服务器是否正常工作
  3. 邮件是否被标记为垃圾邮件

特殊字符处理

如果邮件包含非 ASCII 字符 (如中文),需要使用 MIME 编码:

Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: base64

然后将正文内容进行 Base64 编码。

0x05 SMTP 常用响应码参考

响应码含义
220服务就绪
221服务关闭传输通道
250请求的邮件操作完成
354开始邮件输入,以 . 结束
421服务不可用,关闭传输通道
450请求的邮件操作未执行 (邮箱不可用)
451请求的操作中止:处理出错
452请求的操作未执行:系统存储不足
500语法错误,命令无法识别
501参数语法错误
502命令未实现
503错误的命令序列
550请求的操作未执行:邮箱不可用
551用户非本地,请尝试转发
552请求的邮件操作中止:超过存储分配
553请求的操作未执行:邮箱名不合法
554传输失败 (通常是中继被拒绝)

0x06 实用技巧

使用 VRFY 命令验证邮箱

在发送邮件前,部分服务器可以使用 VRFY 命令验证邮箱是否存在:

VRFY bob@mail.w
250 2.1.5 <bob@mail.w>

注意: 出于安全考虑,许多服务器禁用了 VRFY 命令以防止邮箱枚举攻击。

使用 OpenSSL 连接加密端口

如果需要连接到使用 TLS 加密的端口,可以使用 openssl 替代 telnet。

总结

虽然在实际工作中我们很少需要手动发送邮件,但掌握这些底层知识对于理解邮件系统的工作机制、排查邮件问题、配置邮件服务器都有重要意义。手动操作 SMTP 协议也让我们更加理解邮件客户端在后台为我们做了多少工作,以及为什么邮件系统的配置和维护需要如此多的专业知识。

本文就到这里,如您有任何疑问,请留言讨论。



下一篇
GPG 完全指南:从入门到实践

0 条评论
  • 最新
  • 最热
  • 最早
  • 作者
关闭评论
「欸这里空空如也,要不你来说一句?」