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

时间:2021-09-06 09:28:20

一步一步从原理跟我学邮件收取及发送 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 编码后就是 dGVzdDE= 和 MTIzNDU2 好了,用两个字符串替换掉前面的就可以登录成功了.

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

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

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

图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.邮箱的登录和绕不开的base64

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

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

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

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

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

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

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

  1. 一步一步从原理跟我学邮件收取及发送 10.四句代码说清base64

    经过前几篇的文章,大家应该都能预感到一定要讲解 base64 函数的内容了.是的,马上要到程序登录的代码,base64 是必须要实现的. base64 很早以前我就接触了,在项目中也很喜欢用.但每换一 ...

  2. 一步一步从原理跟我学邮件收取及发送 11.完整的发送示例与go语言

    经过了这个系列的前几篇文章的学习,现在要写出一个完整的 smtp 邮件发送过程简直易如反掌.    例如我们可以轻松地写出以下的纯 C 语言代码(引用的其他C语言文件请看文末的 github 地址): ...

  3. 一步一步从原理跟我学邮件收取及发送 5.C语言的socket示例

    说到 C 语言版本的程序,首先要解决的问题就是兼容性. 作为 20 年开发有 10 多年是在服务端的程序员,我深刻地感受到服务端平台的两极分化之严重,linux 派对 windows 那是超级的不屑一 ...

  4. 一步一步从原理跟我学邮件收取及发送 3.telnet命令行发一封信

    首先要感谢博客园管理员的及时回复,本系列的第二篇文章得以恢复到首页,这是对作者的莫大鼓励.说实在的本来我真的挺受打击的.好在管理员说只是排版上有些问题,要用代码块修饰下相关的信息.说来惭愧因为常年编码 ...

  5. 一步一步从原理跟我学邮件收取及发送 4.不同平台下的socket

    既然是面向程序员的文章那当然不能只说说原理,一定要有实际动手的操作.    其实作为我个人的经历来说,对于网络编程,这是最重要的一章! 作为一位混迹业内近20年的快退休的程序员,我学习过很多的开发语言 ...

  6. 一步一步从原理跟我学邮件收取及发送 8.EHLO 命令详解

    我们在上一篇中解决了接收一行命令的问题后,就可以来具体的分析邮件发送过程中涉及到的 SMTP 协议内容了. 首先来看通讯过程中的第一个内容:服务器在客户端连接上来后会主动发送一个问好的信息,所以这第一 ...

  7. 一步一步从原理跟我学邮件收取及发送 9.多行结果与socket的阻塞

    前几篇的文章发表后,有网友留言说没有涉及到阻塞的问题吗?在 socket 的编程当中,这确实是个很重要的问题.结合目前我们文章的内容进度,我们来看看为什么说阻塞概念很重要. 接着上篇的内容,当我们发送 ...

  8. 一步一步从原理跟我学邮件收取及发送 12.telnet命令行收一封信pop3

    本系列上一篇文章中我们就说到了,这一次我们要说 pop3 收信了.虽然我觉得应该先说完 mime 格式,不过估计大家已经不耐烦了 -- 怎么老在说发送啊?我们要看收取!    好吧,来啦,来啦!收取邮 ...

  9. 一步一步从原理跟我学邮件收取及发送 13.mime格式与常见字符编码

    在前面的本系列文章中我们已经学会了邮件的发送和收取.但在收取中我们看到的是一串串的乱码,回忆前面的发送过程,我们会奇怪:我们前面的邮件是明文啊.为什么明文的邮件明明也可以正常工作,还要弄乱码似的字符串 ...

随机推荐

  1. windows系统下npm 全局安装路径问题

    安装了nodejs之后,npm的路径默认一直都是appData,表示很讨厌,于是尝试修改在安装目录(D盘空间很大啊) 安装目录:D:\program files\nodejs 一.在nodejs下新建 ...

  2. 【230】4T硬盘如何完全利用(GPT)

    参考:如何选择超过2T和3T及以上硬盘的MBR与GPT分区形式 新购置的硬盘是 4TB 的,装上后只能用 2TB 的,查明后得知是因为 MBR 只支持 2TB 的(默认情况下是 MBR 分区形式的), ...

  3. ArrayList Vector LinkedList 区别与用法

    转载自: http://www.cnblogs.com/mgod/archive/2007/08/05/844011.html 最近用到了,所以依然是转载 ArrayList 和Vector是采用数组 ...

  4. 用 Python 和 OpenCV 检测图片上的条形码

      用 Python 和 OpenCV 检测图片上的的条形码 这篇博文的目的是应用计算机视觉和图像处理技术,展示一个条形码检测的基本实现.我所实现的算法本质上基于* 上的这个问 ...

  5. Netsharp快速入门(之16) Netsharp基础功能(权限管理)

    第5章     Netsharp基础功能 5.1     权限配置 5.1.1  功能权限 1.配置权限功能点,打开平台工具-基础业务-操作管理 2.选择资源节点为销售订单,点添加常用操作,添加完成后 ...

  6. 2879: [Noi2012]美食节 - BZOJ

    Description CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽 ...

  7. IE8下div中2个button仅仅显示一个

    IE8下div中2个button仅仅显示一个,代码例如以下: <div id="adviceType" style="display: none;" &g ...

  8. hdu3709 Balanced Number 数位DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3709 题目大意就是求给定区间内的平衡数的个数 要明白一点:对于一个给定的数,假设其位数为n,那么可以有 ...

  9. &lpar;转&rpar;Java线程:新特征-线程池

    Java线程:新特征-线程池   Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利 ...

  10. 恢复误删的DB table数据

    由于一时手误输入了 DELETE FROM TABLE WHERE age REGEXP '\d';导致这个表的数据被删除 解决方法: 登录mysql,查看目前的binlog文件 mysql> ...