telnet如何用命令行发送邮件?
用 telnet 与 SMTP 服务器交互即可在命令行发送邮件。核心流程是:建立连接 → 握手(EHLO/HELO)→(可选)认证 → 指定发件人与收件人 → 发送正文(DATA)→ 结束并退出。以下给出可直接复用的步骤与注意事项。📨

一、前提与准备
- 你需要一个可访问的 SMTP 服务器地址与端口(常见:25/2525,587 通常要求加密)。
- 若服务器要求登录,准备好账号与密码(注意:明文认证只适合测试环境)。
- 某些云/运营商会封锁 25 端口,必要时改用 2525 或联系服务商放行。🔐
二、基础发送流程(不启用加密的测试环境)
telnet smtp.example.com 25
典型对话示例(行尾回车换行):
S: 220 smtp.example.com ESMTP
C: EHLO client.example.com
S: 250-smtp.example.com Hello
S: 250 AUTH LOGIN PLAIN
C: AUTH LOGIN ← 若服务器需要认证
S: 334 VXNlcm5hbWU6
C: dXNlckBleGFtcGxlLmNvbQ== ← base64(用户名)
S: 334 UGFzc3dvcmQ6
C: c2VjcmV0MTIz ← base64(密码)
S: 235 Authentication successful
C: MAIL FROM:<sender@example.com>
S: 250 OK
C: RCPT TO:<rcpt@example.com>
S: 250 Accepted
C: DATA
S: 354 End data with <CR><LF>.<CR><LF>
C: From: sender@example.com
C: To: rcpt@example.com
C: Subject: 测试邮件(telnet)
C: Date: Tue, 25 Nov 2025 10:30:00 +0800
C: Content-Type: text/plain; charset=UTF-8
C:
C: 这是一封通过 telnet 发送的测试邮件。🙂
C: .
S: 250 Queued as 12345
C: QUIT
S: 221 Bye
要点:
EHLO优先于HELO,可获知服务器能力(如 AUTH、PIPELINING 等)。- 正文前需有空行分隔头部与正文;结束用“
.”独占一行。 - 正文里若某行以“.”开头,需写成“..”(服务器会还原)。
三、带认证与编码要点
AUTH LOGIN使用 Base64:echo -n 'user@example.com' | base64 echo -n 'secret123' | base64- 部分服务器返回
530 Authentication required或550类错误时,先完成认证或检查发件人与收件人策略(如禁止中继)。
四、遇到“必须加密/STARTTLS”的处理
许多服务在 587/25 端口要求 STARTTLS(例如提示 530 Must issue a STARTTLS command first)。telnet 无法升级加密,应改用支持 TLS 的方式进行同样的 SMTP 会话,例如:
openssl s_client -starttls smtp -connect smtp.example.com:587
连接建立后与上面的 SMTP 对话完全相同(EHLO → AUTH → MAIL/RCPT → DATA)。🔒
五、常见状态码快速参考
- 220 服务就绪
- 250 操作成功(如地址接受、邮件入队)
- 235 认证成功
- 354 开始输入邮件内容
- 530/534 需要认证或需要 TLS
- 550/553 地址被拒绝(用户不存在/策略限制)
六、排错与实战建议 💡
- 连不上:检查端口是否被拦截、防火墙策略、DNS 解析。
- 被拒收:直投到对方 MX 可能因缺少反向解析/PTR、SPF、DKIM、策略评分而被拒;更稳妥做法是通过自家或授权中继投递。
- 编码:正文中文建议
Content-Type: text/plain; charset=UTF-8,必要时加Content-Transfer-Encoding: base64/quoted-printable。 - 批量测试:可写脚本自动化生成 SMTP 指令,但务必遵守服务端发送限制与合规策略。
按照以上流程,你即可用命令行与 telnet 完成 SMTP 交互式发信;生产环境请使用支持 TLS/认证与重试队列的专业 MTA 或客户端,telnet 更适合定位问题与验证链路。🚀