一步一步从原理跟我学邮件收取及发送 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格式与常见字符编码
在前面的本系列文章中我们已经学会了邮件的发送和收取.但在收取中我们看到的是一串串的乱码,回忆前面的发送过程,我们会奇怪:我们前面的邮件是明文啊.为什么明文的邮件明明也可以正常工作,还要弄乱码似的字符串 ...
随机推荐
- 【功能代码】---4用JS获取地址栏参数方法
用JS获取地址栏参数方法 // 方法一:采用正则表达式获取地址栏参数:( 强烈推荐,既实用又方便!) function GetQueryString(name) { var reg = new Reg ...
- 多命令顺序执行,dd命令,管道|,grep,通配符,其他特殊符号
多命令顺序执行:命令1;命令2 命令之间没有逻辑关系 命令1&&命令2 命令1执行正确才执行命令2,命令1执行错误不会执行命令2 命令1||命令2 命令执行错误才执行命令2,命令1执行 ...
- sqlserver 存储过程 递归查询分组+hierarchyid重建会员关系
CREATE PROCEDURE [dbo].[GetGroupInfo] @s_code NVARCHAR() = --会员卡号 AS BEGIN declare @p int; --查询唯一性结果 ...
- Android 开发,你遇上 Emoji 头疼吗?
在 Android 中,如果需要使用的到 Emoji 表情,你会发现在某些设备上,有一些 Emoji 表情会被以豆腐块 "☐" 的形式显示,这是因为当前设备并不支持这个 Emoji ...
- Java SE 8 流库(三)
1.7. Optional类型 容器对象,可能包含或不包含非空值.如果存在一个值,isPresent()将返回true,get()将返回值.还提供了依赖于包含值是否存在的附加方法,如orElse()( ...
- 理解new构造函数和apply以及call
今天在看设计模式的时候,遇到一些挺低级的东西,搞不懂,顾查阅资料整理记录一番. 先了解一下new构造函数的过程: function func(){ console.log('do'); } var f ...
- 8.nginx防DDOS
配置详解,查看链接:http://www.myhack58.com/Article/60/sort096/2015/59453.htm 配置文件: http { #白名单 ...
- ActiveReports 6:如何升级旧版本的项目
如果现在的项目使用的是ActiveReports for .NET 3.0,那么有两种升级方式: 一是使用ActiveReports 6.0附带的转换工具(参见下面"升级ActiveRepo ...
- iOS开发系列
因为最近面试了一些人,校招.初中级.高级.架构师,各种级别的,发现大家水平差异很大,有的高级的工程师很多问题都回答不上来,所以想梳理下iOS的知识点,写成一个系列,如果时间允许的话,会录制成视频放到网 ...
- Tomcat 快速入门
Tomcat 快速入门 版本说明 本文使用 Tomcat 版本为 Tomcat 8.5.24. Tomcat 8.5 要求 JDK 版本为 1.7 以上. 简介 Tomcat 是什么 Tomcat 是 ...