clq

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一步一步从原理跟我学邮件收取及发送 1.网络命令的发送

多年前我写过一个叫 eemail 的邮件客户端,原因是当时笔者的姐姐是位小有名气的作家需要通过邮件发稿子给她的编辑.而当时的 foxmail 等客户端都需要配置 smtp/pop3 地址,这对于普通用户来说简直就是无法逾越的鸿沟,在给 foxmail 开发组数次建议无果后(就是没理我的意思..),我决定自己写一个.而且当时 html 病毒流行,编辑部要求来稿是纯文本. 你让一个作家怎样知道什么是纯文本 ... 所以这个 eemail 有两个特色,1. 是自动配置了各大邮箱的 smtp/pop3 配置并且是网络同步更新的; 2.是只使用纯文本的邮件内容编辑. 这个软件一度是姐姐部门的 "御用" 邮件发送软件,直到我离开深圳无力再负担 eemail 的服务器为止.又过了很多年,感觉自己也快"退休"了,还是总结一下吧,把原理尽我所知说一下,也许有后来者需要呢?

记得当年还是学生时看过记者采访张小龙请教怎样开发一个邮件客户端,张先生哔哩哔哩说了一堆术语,列举了一堆 rfc 协议 ... 记者表示没听懂,小龙说过程就是这样了邮件程序的开发过程是比较麻烦的...

作为二流软件开发专业学生的我和同学们面面相觑也是没听懂.

之后我是看了很多网络编程方面的书,学校图书馆的编程书毫不夸张地说都翻遍了也是没头绪,当时的书籍主要说的是 windows 的各种 api,java 当时也有了,但就是没有网络应用开发相关的,这当然也和当时网络刚出现有
关(98年). 最后我渐渐了解了还是通过 ftp 协议的某本书的示例,没开发过网络应用的同学一定会觉得奇怪,怎么学习开发 ftp 还能学会开发电子邮件?

这是因为当初的各种网络协议都是基于网络命令行演变而来的,不光是 ftp/smtp/pop3 如此,就是大家最常用的网页 http 协议也是如此,它们基于网络命令行也是有原因的,那就是早期的电脑都是命令行的,后来苹果出现了...

所以要学习电子邮件开发第一步不是去看什么协议,而是要了解什么是网络命令行.

开始前让我们先申请一个邮箱: "newbt.net 的临时邮箱" 或者 "163.com 的正式邮箱". (163 现在好象要绑定手机什么的,临时用用的话用 newbt 的好了,账号秒开.)

既然是命令行,那么就来看看命令行是什么样的,按下 WIN + R 键会打开 windows 的 "运行" 对话框,输入 cmd 然后点击确定,这时 windows 的命令行就出来了,它会先给你显示 windows 的版本和当前的路径.(用 mac 的土豪
和用 linux 的..非土豪请使用命令行工具) 然后我们输入一个命令 dir ,这时命令行窗口会显示当前目录下的文件名列表(用 mac 的土豪和用 linux 的..非土豪请使用 ls 命令,其实差不多的,所以后面就是 windows 下为例了,不再写 mac/linux 对应的命令).
好了,这就是命令行,一般还会有人给它起个名称叫本机命令行,总之就是让自己正在使用的这台机器执行一个命令的东东. 好了,现在网络出现了,我还要命令网络上的另外一台机器也干点啥 ... 好,网络有先驱们想那弄个网络版本的命令环境好了.

重复上面的步骤,不过把 "cmd" 换成 "telnet newbt.net 25", 执行后神奇的一幕出现了,命令行显示了 "220 newbt.net ESMTP eEmail-Server 2.0". 然后执行命令 ehlo , 这时服务器会回两条信息回来...

这里必须要停一停了,因为会出现很多问题...

1.擦... telnet 是啥玩意,我这里提示不存在.

现在新的 windows 版本不一定带有 telnet 客户端,需要在 windows 功能模块中打开. "点我查看如何开通"

2.telnet 我知道, newbt.net 是啥,我要 163 邮箱.
好吧,把命令换成 "telnet smtp.163.com 25". 你会说,为啥有个 stmp ... 好吧,这就是我前面用 newbt.net 的原因,
后面再解释.

(图1.要输入的 telnet newbt.net 25 命令)

(图2.连接成功后的服务器回应,及 ehlo 命令的回应)


如果连接的不是 newbt.net 邮箱而是 163 邮箱,那么还会有两个坑要爬:

1.咦,我输入了 ehlo 然后回车,163 说我 "500 Error: bad syntax"

这个,咳咳,忘了说了网络程序虽然有协议但各个程序实现起来是有些差异的,因为协议不可能面面俱到,现实中兼容性是个大问题... 好了,具体到这个那是因为 163 邮箱要求命令英文(最好是)大写,因为协议中没有说是大写还是小写啊(其实是有的,不太明显而已)

2.好吧,我换成大写命令了... 怎么还是不行啊.
这... 我也无语,因为 163 邮箱要求 ehlo 命令后要带上它 163 的名称,这个名称还不能乱写,它必须是 "163.com",
所以如果用 163 邮箱来学习这些命令的话那么要输入的是 "EHLO 163.com"

 (图3. 因为对协议实现的不同 163 的命令格式要求更严格. 因为现在国内还用不了 gmail 所以不能给大家看 gmail 的实现了)


好了,经过这番掉一层皮的折腾,我终于过了网络编程的第一关: 使用及认识什么是网络命令. 但是这网络命令中还有一个大坑,我们下编文章再说. 码字好辛苦,休息下先.

--------------------------------------------------
附1: newbt.net 的邮箱可以在 这里 申请,过程很简单.
附2: win7 及以上版本的 windows 可能没有打开 telnet 功能,请查看 这里 . (注:打开 telnet 客户端就可以了,开 telnet 服务端的话不太安全)

--------------------------------------------------

版权声明:

本文已授权百家号 "clq的程序员学前班" .

 

posted on 2018-01-19 12:34  clq  阅读(1130)  评论(4编辑  收藏  举报