Telnet 中使用 smtp 发送邮件
Telnet 中使用 smtp 发送邮件
原文作者:litreily
原文链接:https://www.litreily.top/2017/08/17/telnet-smtp/
这两天在折腾 javascript 发送邮件的事情, 然后就看到了这个.
Telnet是远程登录服务的标准协议和主要方式,工作于TCP/IP协议族的应用层,常用于远程登录web服务器,其中便包括SMTP,POP3等邮件服务器。
这几天参考书籍《计算机网络-自顶向下方法》学习计算机网络知识,顺便尝试了如何使用Telnet登录smtp发送邮件,下面通过一个简单示例介绍具体的发送过程。
Telnet smtp.163.com 25
smtp对应的端口号为25,以163邮箱为例,下面是邮件发送过程。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!shell
→ ~ 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
招呼语
1
2
3
4
#!shell
S 220 163.com Anti-spam GT for Coremail System (163com[20141201])
C helo 163.com
S 250 OK
220
代表服务器已准备好,客户端首先向服务器打一声招呼helo
,服务器接收到后返回一个250
应答信号,代表打招呼成功,下面可以进行账户的密码认证。
账户认证
1
2
3
4
5
6
7
#!shell
C auth login
S 334 dXNlcm5hbWU6
C MTgyNjY2MzI4NzJAMTYzLmNvbQ==
S 334 UGFzc3dvcmQ6
C ****************
S 235 Authentication successful
客户端发送auth login
声明自己将进行邮箱账户的用户名认证和密码认证。服务器端返回一个以334
代码开头的提示信息,不必追究其语义,而后用户依次输入通过Base64加密的邮箱名和密码,加密网址见后续参考资料。当输入的账号密码无误时,服务端将返回认证成功的提示语。
声明邮箱地址
1
2
3
4
5
#!shell
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>
声明邮箱的源地址和目的地址。
书写邮件内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!shell
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,邮件地址 From,To 等,然后再书写邮件主体内容,更详细的格式可以参考文档【RFC 821】。编辑结束后,以单行的点号.
结束。如果一切正常,服务器端将返回以250
开头的应答信息,并提示邮件以进入smtp的发送队列。此时便可以查收邮件予以验证了。
退出Telnet
1
2
3
#!shell
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 操作失败
参考资料
SMTP文档(RFC 821) : https://tools.ietf.org/pdf/rfc821.pdf
SMTP Code : https://bbs.csdn.net/topics/80275246
163.com 邮件退信代码 : https://help.163.com/09/1224/17/5RAJ4LMH00753VB8.html