Telnet中使用smtp发送邮件

Telnet是远程登录服务的标准协议和主要方式,工作于TCP/IP协议族的应用层,常用于远程登录web服务器,其中便包括SMTPPOP3等邮件服务器。

这几天参考书籍《计算机网络-自顶向下方法》学习计算机网络知识,顺便尝试了如何使用Telnet登录smtp发送邮件,下面通过一个简单示例介绍具体的发送过程。

Telnet smtp.163.com 25

smtp对应的端口号为25,以163邮箱为例,下面是邮件发送过程。

→ ~ telnet smtp.163.com 25
Trying 220.181.12.15...
Connected to smtp.163.com.
Escape character is ^].
220 163.com Anti-spam GT for Coremail System (163com[20141201])
helo 163.com
250 OK
auth login
334 dXNlcm5hbWU6
MTgyNjY2MzI4NzJAMTYzLmNvbQ==
334 UGFzc3dvcmQ6
****************
235 Authentication successful
mail from:<182****2872@163.com>
250 Mail OK
rcpt to:<707***098@qq.com>
250 Mail OK
data
354 End data with <CR><LF>.<CR><LF>
From: 182****2872@163.com
To: 707***098@qq.com
Subject: Test the use of smtp

  Hello, litreily.
  This is a message edit with telnet.

Best wish to you.
Litreily
.
250 Mail OK queued as smtp11,D8CowAAnjlqKlZVZXa4QAQ--.18342S2 1502975693
quit
Connection closed by foreign host.
→ ~

下面分开对每个过程进行解析,C代表客户端,即本机,S代表远程服务器端。整个过程分为以下几步:

  • 打招呼
  • 账户认证
  • 声明邮箱地址
  • 书写邮件内容
  • 退出Telnet

招呼语

S 220 163.com Anti-spam GT for Coremail System (163com[20141201])
C helo 163.com
S 250 OK

220代表服务器已准备好,客户端首先向服务器打一声招呼helo,服务器接收到后返回一个250应答信号,代表打招呼成功,下面可以进行账户的密码认证。

账户认证

C auth login
S 334 dXNlcm5hbWU6
C MTgyNjY2MzI4NzJAMTYzLmNvbQ==
S 334 UGFzc3dvcmQ6
C ****************
S 235 Authentication successful

客户端发送auth login声明自己将进行邮箱账户的用户名认证和密码认证。服务器端返回一个以334代码开头的提示信息,不必追究其语义,而后用户依次输入通过Base64加密的邮箱名和密码,加密网址见后续参考资料。当输入的账号密码无误时,服务端将返回认证成功的提示语。

声明邮箱地址

C mail from:<182****2872@163.com>
S 250 Mail OK
C rcpt to:<707***098@qq.com>
S 250 Mail OK

账户密码认证结束后,客户端通过mail from:<emailName>以及rcpt to:<nameEmail>声明邮箱的源地址和目的地址。

书写邮件内容

C data
S 354 End data with <CR><LF>.<CR><LF>
C From: 182****2872@163.com
C To: 707***098@qq.com
C Subject: Test the use of smtp
C
C   Hello, litreily.
C   This is a message edit with telnet.
C
C Best wish to you.
C Litreily
C .
S 250 Mail OK queued as smtp11,D8CowAAnjlqKlZVZXa4QAQ--.18342S2 1502975693

写明邮件地址后,使用指令data进入邮件编辑状态,服务器端会提示当输入<CR><LF>.<CR><LF>时退出编辑状态。

邮件内容有一定的格式要求,不按要求随意书写有可能被当成垃圾邮件或不合法邮件而退信。通常需要指定邮件主题Subject,其它相关信息包括时间Date,邮件地址FromTo等,然后再书写邮件主体内容,更详细的格式可以参考文档【RFC 821】。编辑结束后,以单行的点号.结束。如果一切正常,服务器端将返回以250开头的应答信息,并提示邮件以进入smtp的发送队列。此时便可以查收邮件予以验证了。

退出Telnet

C quit
S Connection closed by foreign host.

当邮件发送结束后,客户端通过quit退出Telnet

SMTP Code

  • 211 系统状态或系统帮助响应
  • 214 帮助信息
  • 220 服务就绪
  • 221 服务关闭传输信道
  • 235 用户验证成功
  • 250 要求的邮件操作完成
  • 251 用户非本地,将转发向
  • 334 等待用户输入验证信息
  • 354 开始邮件输入,以单行**.**结束
  • 421 服务未就绪,关闭传输信道(当必须关闭时,此应答可以作为对任何命令的响应)
  • 450 要求的邮件操作未完成,邮箱不可用(例如,邮箱忙)
  • 451 放弃要求的操作;处理过程中出错
  • 452 系统存储不足,要求的操作未执行
  • 500 格式错误,命令不可识别(此错误也包括命令行过长)
  • 501 参数格式错误
  • 502 命令不可实现
  • 503 错误的命令序列
  • 504 命令参数不可实现
  • 535 用户验证失败
  • 550 要求的邮件操作未完成,邮箱不可用(例如,邮箱未找到,或不可访问)
  • 551 用户非本地,请尝试
  • 552 过量的存储分配,要求的操作未执行
  • 553 邮箱名不可用,要求的操作未执行(例如邮箱格式错误)
  • 554 操作失败

参考资料