clq

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

一步一步从原理跟我学邮件收取及发送 2.邮箱的登录和绕不开的base64

好了,经过本系列上一篇文章 "1.网络命令的发送",假设大家已经掌握了 email 电子邮件的命令发送的方法.那么下面我们可以来学习如何发送一封邮件了.

如果是传统作家一定要开始讲解 RFC821 协议,然后用它来发送邮件给大伙看看.遗憾的是这种做法有两个问题:
1.是虽然 smtp 有 "简单" 两个字("简单邮件传输协议 SMTP"嘛),但我要这样一轮写下来的话估计没人能看懂;
2.是你要真的按 RFC821 去发送邮件的话,那是发不出去的...发不出去的...发不出去的...  重要的事说三遍!

对了,给初学者先普及一个知识吧,要不他们会奇怪电子邮件说得好好的,为什么冒一个 smtp rfc 的出来.

是这样的,凡事都有规矩,好比写程序要遵守 C++ 语法一样,那么 smtp 可以理解为发送 email 的语法,而 rfc 简单来说可以理解为这些语法的一个合集.

好了,第一篇文章中我就说了大家先申请一个 newbt.net 或者 163 的邮箱,估计也没人去申请吧,因为还没用到用户名和密码,下面我会告诉大家为什么要申请的.

好了,开始吧.
第一步,是要登录向服务器表明自己的身份,我们仍然用 telnet 作为命令的发送工具,具体的命令如下:
telnet newbt.net 25 连接成功后输入
AUTH LOGIN
这是告诉服务器我要登录了,然后服务器会回应
334 dXNlcm5hbWU6
好了,这是告诉你输入密码,好吧我们输入密码
test1

等等,怎么从这堆"乱码"中看出是要让我们输入密码的? 答案是以目前的知识是看不出来的,先不用管那么多,总之记住发送 AUTH LOGIN 命令后就是要输入用户名了.
收到用户名后,服务器会回应
334 UGFzc3dvcmQ6
然后我们输入一下密码
123456
然后服务器会高兴地告诉我们
535 Error: authentication failed

意思是说我们登录失败了...... 大家已经气坏了,你个大骗子!
等等,等等,我之所以先做一个错误的示范是想加深大家对一个事实的印象: 那就是现在"完全"命令行的方式来发送电子邮件已经是行不通的事情了 ... 等等,别走啊 ... 加点辅助工具就可以的 ...

说这个工具之前必须要先提 smtp 协议的演变历史了.

早期的 email 确实是可以直接用命令行发送邮件的,但就在我进入软件专业入校的时间左右(98年),就不能这样做了,因为早期的电子邮件有个转发机制发送电子邮件时可以不直接发给所在的服务器,而交由其他服务器中转,这种设计大概是因为网络开发的先驱们的网络环境不太好,很多时候并不能直接连接到互联网上(这种现象也体现在 ftp 协议上).这是个非常好的设计,但是当互联网普及后带来了一个非常严重的问题:那就是垃圾邮件,垃圾邮件在多个服务中疯狂中转根本无法知道它是否来自正常的用户,因为来源已经被中转的服务器洗白了. 所以现在的服务器都要求在发送服务器上先登录,因为要输入密码,所以为了保密这个密码就要先加密一下,因为以前安全要求没有这么高所以选用的是一个现在看来不怎么安全的 base64 算法,选用 bas64 加密应该还有一个原因那就是 base64 "加密"后的内容仍然是命令行环境可见的. 什么叫"命令行环境可见" ... 我很想对 base64 详细的说一次,不过我估计大家已经不耐烦了,所以以后我再补充到附录中吧.

说了一大堆,大家应该猜出来了这个登录用的辅助工具就是 base64 编码软件,是的,继续前我们必须先将用户名和密码用 base64 算法编码好自己的用户名和密码,好在现在这样的工具到处都是,我们只要在百度上一搜就有很多在线的可用.具体到我用的 test1 和 123456 编码后就是 dGVzdDFAbmV3YnQubmV0 和 MTIzNDU2 其中用户名还要带上域名即test1@newbt.net,好了用这两个字符串替换掉前面的就可以登录成功了.

总结一下,这三个命令其实就是
AUTH LOGIN
dGVzdDFAbmV3YnQubmV0
MTIzNDU2

对应的"原文"其实是
AUTH LOGIN
test1@newbt.net
123456

 

图1. 完整的登录成功过程

 

实际上我们在真实的环境中还应该加上第一篇教程中提过的 EHLO 命令,即发送的命令列表应该是
AUTH LOGIN
EHLO [对方的域名]
[用户名+@+对方的域名](要用 base64 编码,这里要特别注意,后面会详细说)
[密码](要用 base64 编码)

好了,大家可以到 http://www.newbt.net:8888/mail/new_user.php

注册一个邮箱试试. 对于强烈要求看 163 邮箱登录过程的同学来说,我强烈建议您先把上面的过程先走一遍,因为实际的工作当中最常用的并不是 163 邮箱而是您所在公司的企业邮箱,这些企业邮箱的登录过程和 163 是有区别的,而与上面的 newbt.net 的相同(这当然是有原因的,不过一时半会也是来不及说了). 当然了普通用户或者是国企或者民营企业估计是没有自己的企业邮箱,但您的客户特别是海外客户恐怕是有的.

163 的邮箱登录过程与 newbt.net 和大多数企业邮箱登录过程最大的不同通常有以下几点:

1.是连接的服务器要有域名前加上 "smtp.", 第一篇文章中我们就提到过,现在有前面的 smtp 知识,可以告诉大家原因了.前面不是说了过去的 email 是可以在多个服务器中转的嘛,这个其实就是 163 的中转服务器,不过它只为 163 服务罢了,并且也是要登录的,至于 "smtp." 这个并不是什么协议中规定的,只是 163 这样用而已,有些邮箱有可能是 "mail." 前缀或者别的;

2.是 163 发送用户名时不要带上 "@" 符号和域名,这里是个很两难的地方,有些企业邮箱要,有些不要,我的经验是如果对方的企业不太大的话十有八九是要的.

3.发送 auth 命令前一定要发送 ehlo 命令,并且 ehlo 后面一定要是 163.com ,所以这个还是发一下吧,那么如果不是 163 的邮箱,怎么知道 ehlo 后面应该写什么呢 ... 其实这个展开来说就会是一个大问题,所以以后再说吧.

4.好象现在新注册的 163 邮箱还有一步,那就是请先开通客户端 smtp 权限.

经过这一堆坑后,我们可以登录 163 了,见附图(大家自己试吧,一个小时内成功登录的网友请留言,这就是我为什么用 newbt.net 邮箱来讲解的原因了).

 图2.163的示例,包含了错误时的响应

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

ps.本想在这篇中把发送邮件也说完的,不成想写下来要说明的问题这样多,只好在下一篇再说了.

其实如果真的有网友要按这些知识就开始去写邮件的登录过程了,其实还是不够的,还要有很多别的知识才行,这里所说的虽然很长了,其实仍然是属于最基础的知识. 所以还是别急,耐心往下看吧.(因为还有很多坑...很多坑...很多坑...)


另,上一篇文章我分享到百家号后,发现有几个问题: 1.是外部链接全部被取消,所以以后的文章链接就直接显示为原始链接好了; 2.是格式会被转码,因此以后再贴出网络命令时可能不再用双引号号包括(还没想好换什么符号).

版权声明:
本系列文章已授权百家号 "clq的程序员学前班" .

posted on 2018-01-21 13:21  clq  阅读(1010)  评论(4编辑  收藏  举报