0%

Telnet中使用SMTP发送邮件

敲开了计算机网络的小窗子。


这个学期开了计算机网络课程,学校设置的教材为AndrewS Tanenbaum的《计算机网络》,
暑假期间翻阅发现自底向上的讲解看不太懂,因此换成阅读小钟的《计算机网络-自顶向下方法》。
从引言一路看过来感觉体验很好,它能特别清楚和生动地给我讲明白计算机网络到底是怎么一回事儿,是本好书,建议阅读。

本文基于该书应用层一章,以163邮箱为例,记录了如何通过Telnet远程登录smtp邮件服务器来发送邮件。

准备工作

  • 开启Telnet服务
    控制面板 -> 程序 -> 程序和功能 -> 启用或关闭Windows功能 -> 勾选Telnet客户端 -> 确定

  • 开启邮箱POP3/SMTP/IMAP服务
    登录邮箱 -> 设置 -> POP3/SMTP/IMAP -> 勾选POP3/SMTP服务和IMAP/SMTP服务 -> 保存

cmd中使用命令

1
telnet smtp.163.com 25

其中smtp.163.com是163邮箱的SMTP服务器名称,25是邮件服务器进程的默认端口号。
此命令在本地主机与邮件服务器之间建立TCP连接,连接成功后将从该服务器收到220回答。

打招呼

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

220代表服务器已就绪,客户端发送helo进行打招呼(xxx处可任意填写),服务器返回250,代表打招呼成功。

登录

1
2
3
4
5
6
C: auth login
S: 334 dXNlcm5hbWU6
C: **********//由base64加密过的账号
S: 334 UGFzc3dvcmQ6
C: **********//由base64加密过的密码
S: 235 Authentication successful

客户端发送auth login声明自己将进行邮箱账户的用户名认证和密码认证,服务器返回334,指示输入账号密码。账号密码匹配成功后,服务器返回235,代表用户验证成功。

此处有几个需要注意的点:

  • 账号和密码皆需进行base64加密
  • 账号带不带邮箱后缀均可
    如我的邮箱lemniscatex @163.com,加密后应输入bGVtbmlzY2F0ZXg=bGVtbmlzY2F0ZXhAMTYzLmNvbQ==
  • 密码不是登录邮箱时的密码,而是用于登录第三方邮件客户端的授权码
    授权码可在邮箱 -> 设置 -> 客户端授权密码中找到

声明邮箱地址

1
2
3
4
C: mail from:<lemniscatex@163.com>
S: 250 Mail OK
C: rcpt to:<131****039@qq.com>
S: 250 Mail OK

客户端发送mail fromrcpt to声明邮件发送方和接收方。

写邮件

1
2
3
4
5
6
7
8
9
C: data
S: 354 End data with <CR><LF>.<CR><LF>
C: From: lemniscatex@163.com
C: To: 131****039@qq.com
C: Subject: This is a simple test
C:
C: Hello from the other side.
C: .
S: 250 Mail OK queued as smtp10,DsCowACXsyhk1HRdso65BQ--.46708S2 1567937734

客户端发送data声明自己将进入邮件编辑状态,服务器会提示当输入<CR><LF>.<CR><LF>时退出编辑状态。
邮件内容有一定格式要求,包括以From:指定邮件发送方邮箱,To:指定邮件接收方邮箱,Subject:指定邮件标题;邮件正文与首部行须以空行分隔开;邮件正文以单行的句点结束。
发送成功后服务器将返回250,代表邮件已进入发送队列,此时即可打开邮箱验证邮件是否已发送成功。

此处分享几点失败经验:

  • 如果不写From:To:首部行,邮件将无法成功发送
  • 如果首部行和正文间不加空行,邮件可以成功发送,但是会缺失正文内容
  • 如果在输入的时候回退过,发出的邮件中会显示被清除的字符以及回退符

退出

1
2
C: quit
S: Connection closed by foreign host.

邮件发送结束后,客户端发送quit声明退出Telnet。

结果

完成!