一步一步从原理跟我学邮件收取及发送 2.邮箱的登录和绕不开的base64
一步一步从原理跟我学邮件收取及发送 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

图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的程序员学前班" .
一步一步从原理跟我学邮件收取及发送 2.邮箱的登录和绕不开的base64的更多相关文章
- 一步一步从原理跟我学邮件收取及发送 10.四句代码说清base64
经过前几篇的文章,大家应该都能预感到一定要讲解 base64 函数的内容了.是的,马上要到程序登录的代码,base64 是必须要实现的. base64 很早以前我就接触了,在项目中也很喜欢用.但每换一 ...
- 一步一步从原理跟我学邮件收取及发送 11.完整的发送示例与go语言
经过了这个系列的前几篇文章的学习,现在要写出一个完整的 smtp 邮件发送过程简直易如反掌. 例如我们可以轻松地写出以下的纯 C 语言代码(引用的其他C语言文件请看文末的 github 地址): ...
- 一步一步从原理跟我学邮件收取及发送 5.C语言的socket示例
说到 C 语言版本的程序,首先要解决的问题就是兼容性. 作为 20 年开发有 10 多年是在服务端的程序员,我深刻地感受到服务端平台的两极分化之严重,linux 派对 windows 那是超级的不屑一 ...
- 一步一步从原理跟我学邮件收取及发送 3.telnet命令行发一封信
首先要感谢博客园管理员的及时回复,本系列的第二篇文章得以恢复到首页,这是对作者的莫大鼓励.说实在的本来我真的挺受打击的.好在管理员说只是排版上有些问题,要用代码块修饰下相关的信息.说来惭愧因为常年编码 ...
- 一步一步从原理跟我学邮件收取及发送 4.不同平台下的socket
既然是面向程序员的文章那当然不能只说说原理,一定要有实际动手的操作. 其实作为我个人的经历来说,对于网络编程,这是最重要的一章! 作为一位混迹业内近20年的快退休的程序员,我学习过很多的开发语言 ...
- 一步一步从原理跟我学邮件收取及发送 8.EHLO 命令详解
我们在上一篇中解决了接收一行命令的问题后,就可以来具体的分析邮件发送过程中涉及到的 SMTP 协议内容了. 首先来看通讯过程中的第一个内容:服务器在客户端连接上来后会主动发送一个问好的信息,所以这第一 ...
- 一步一步从原理跟我学邮件收取及发送 9.多行结果与socket的阻塞
前几篇的文章发表后,有网友留言说没有涉及到阻塞的问题吗?在 socket 的编程当中,这确实是个很重要的问题.结合目前我们文章的内容进度,我们来看看为什么说阻塞概念很重要. 接着上篇的内容,当我们发送 ...
- 一步一步从原理跟我学邮件收取及发送 12.telnet命令行收一封信pop3
本系列上一篇文章中我们就说到了,这一次我们要说 pop3 收信了.虽然我觉得应该先说完 mime 格式,不过估计大家已经不耐烦了 -- 怎么老在说发送啊?我们要看收取! 好吧,来啦,来啦!收取邮 ...
- 一步一步从原理跟我学邮件收取及发送 13.mime格式与常见字符编码
在前面的本系列文章中我们已经学会了邮件的发送和收取.但在收取中我们看到的是一串串的乱码,回忆前面的发送过程,我们会奇怪:我们前面的邮件是明文啊.为什么明文的邮件明明也可以正常工作,还要弄乱码似的字符串 ...
随机推荐
- Laravel学习笔记(三)--在CentOS上配置Laravel
在Laravel框架上开发了几天,不得不说,确实比较优雅,处理问题逻辑比较清楚. 今天打算在CentOS 7上配置一个Laravel,之前都是在本机上开发,打算实际配置一下. 1)系统 ...
- 小白的Python之路 day3 函数
1.函数基本语法及特性 背景提要 现在老板让你写一个监控程序,监控服务器的系统状况,当cpu\memory\disk等指标的使用量超过阀值时即发邮件报警,你掏空了所有的知识量,写出了以下代码 1 2 ...
- VM环境下Linux虚拟机扩展存储空间操作方法总结
用VMwareware虚拟机安装的 Linux 系统剩余空间不足,造成软件无法正常安装.如果重新装一遍系统就需要重新配置好开发环境和软件的安装配置. 一.空间扩展 (1)打开VMware,选择Edi ...
- Keras的安装与配置
Keras是由Python编写的基于Tensorflow或Theano的一个高层神经网络API.具有高度模块化,极简,可扩充等特性.能够实现简易和快速的原型设计,支持CNN和RNN或者两者的结合,可以 ...
- RabbitMQ阻塞读取时数据时,关闭channel引起的问题和解决方案
项目场景: 最近在项目中使用了RabbitMq,其中有一个功能必须能随时切断RabbitMq的coumser.第一时间写出来的代码如下: 伪代码: while(flag){ QueueingConsu ...
- iOS设置拍照retake和use按钮为中文简体
iOS设置拍照retake和use按钮为中文简体,设置有两种方式一个是代码直接控制,第二就是xcode配置本机国际化为“china”(简体中文). 本文重点要说的是第二种,这样配置有两个好处,一是操作 ...
- React Native绑定微信分享/登录/支付(演示+实现步骤+注意事项)
React Native(以下简称RN)绑定微信分享/微信登录/微信支付的实现演示+源码+注意事项!微信的调用大同小异,本文实现了微信的分享功能,其他功能可以在链接文档里面找到具体的方法. 本文分文三 ...
- MySQL数据库规约.
一.建表规约 1.表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint(1 表示是, 0 表示否) . 2.表名.字段名必须使用小写字母或数字, 禁止 ...
- 嵌入式设计初体验:永远的hello,world
目前,xilinx的zynq系列FPGA炒的火热,SOC成为FPGA发展的必然趋势.可见所有功能均用硬件描述语言设计是不科学的.硬件逻辑独有的并行性使其在实时处理和并行算法中占尽优势,但当执行串行操作 ...
- 对于group by 和 order by 并用 的分析
今天朋友问我一个sql查询. 需求是 找到idapi最近那条数据,说明idapi 是重复的,于是就简单的写了 SELECT * FROM `ag_alarm_history` group by ` ...