一步一步从原理跟我学邮件收取及发送 12.telnet命令行收一封信pop3
本系列上一篇文章中我们就说到了,这一次我们要说 pop3 收信了。虽然我觉得应该先说完 mime 格式,不过估计大家已经不耐烦了 -- 怎么老在说发送啊?我们要看收取!
好吧,来啦,来啦!收取邮件现在常用的有 pop3 和 imap 协议,不过从传统来说 pop3 受众要广得多。有了前面的基础,要实现 pop3 收信其实非常的简单。我们仍然用第一篇"网络命令的发送"中所说的方法来学习 pop3 协议。
首先仍然是用 telnet 连接 pop3 对应的网络地址,这里是 telnet newbt.net 110,其中 pop3 的默认端口就是 110 ,以 newbt 邮箱为例子,很容易就能登录邮箱,用到的命令请看下图:
大家可以看到,比起 smtp 的登录来说是简单得多了,不需要回应对方的域名;甚至密码也不用进行 base64 编码(当然一定程度来说安全性不高,不过现在都有 ssl )。
好了照例又来个 163 邮箱的例子,照例又比 newbt 的麻烦一些:需要在域名前加上 "pop3." 的子域名(好在其他的内容差不多),这个 "pop3" 的子域名前缀和前面文章提到的"smtp"前缀一样并没有什么标准可言,即:
telnet pop3.163.com 110
完整的要发送的命令列表为:
user 您的用户名@邮箱域名( 邮箱的话后面不用加,只要用户名就行)
pass 您的密码
uidl
retr (按 retr 的结果,想收哪封就写哪个数字)
命令执行的结果如下图:

(成功登录163邮箱)

(uidl 命令会列出所有邮件的序号和唯一标识)

(retr命令的结果就是邮件内容,准确来说是邮件的 mime 源码)
完了。完了?是的,就是这样,其他的 pop3 命令用不着实现。不过对于过去的邮件客户端来说一般还会删除刚收取的邮件,那就再加两个命令:
dele (按 retr 的结果,想删除哪封就写哪个数字)
quit(有些邮箱退出后才真删除)
不过现在是手机时代,电脑和手机都应该能看到信,所以现在的实现就不要收取后删除了。
大家可以看到 pop3 的收取简直是简单得令人发指啊! ... 谁说不是呢 ... 只要掌握了第一篇发送网络命令的方法,其实大部分的网络通讯协议都会有这种感觉,所以我个人觉得我们这个系列文章中价值最高的就是第一篇文章。
要注意的是,这里的示例和传统的示例有一点区别,那就是我用的是 uidl 列出邮件,而传统的教程可能会用 list 命令。因为在具体的客户端编写中还会碰到一个问题:怎样不重复收取邮件呢?看到那个 uidl 命令的返回了吗?每一行回应的空格后面就是一封信的唯一标志。同时这个命令回应的结束符号和我们前面说的 smtp 发送的邮件内容结束符号是一样的也就是"."加前后的两个换行。具体区别可看 rfc 文档。
这里有必要和大家说的一个问题就是 rfc 只是一个参考,要按它的要求全部实现的话其实大多数情况下是没有必要的,就好比所有的 C++ 编译器都没有完全实现全部的 C++ 标准一样。当然了还是要提供一下相关 rfc 文档的链接:
http://man.chinaunix.net/develop/rfc/RFC1939.txt
备用地址
http://newbt.net/ms/vdisk/show_bbs.php?id=1B938647F353291F60658D8FB893223F&pid=160
协议虽然很简单,但是大家有没有看到 retr 收信后的结果是一堆"乱码",这也就是我本不打算先说 pop3 协议的原因。这些并不是乱码,而是电子邮件的 mime 格式,另外 mime 还普遍使用在 http 协议中。mime 的格式相当复杂,电子邮件用到的又更是复杂,不过这是编写电子邮件程序必须经过的 ... 好了,我们在后面的文章再说吧。不过 mime 格式恐怕得花好几篇文章才能说完,还不一定能说清,大家要有心理准备 :)
因为还没有说到 mime 格式,写出具体的收信代码也没有什么意义,所以以后我们讲完 mime 再给出示例吧。不过有了前面的基础代码,相信大家要自己写出来也是易如反掌的事情。
-------------------------------------------------
版权声明:
本系列文章已授权百家号 "clq的程序员学前班" . 文章编排上略有差异.
一步一步从原理跟我学邮件收取及发送 12.telnet命令行收一封信pop3的更多相关文章
- 一步一步从原理跟我学邮件收取及发送 3.telnet命令行发一封信
首先要感谢博客园管理员的及时回复,本系列的第二篇文章得以恢复到首页,这是对作者的莫大鼓励.说实在的本来我真的挺受打击的.好在管理员说只是排版上有些问题,要用代码块修饰下相关的信息.说来惭愧因为常年编码 ...
- 一步一步从原理跟我学邮件收取及发送 8.EHLO 命令详解
我们在上一篇中解决了接收一行命令的问题后,就可以来具体的分析邮件发送过程中涉及到的 SMTP 协议内容了. 首先来看通讯过程中的第一个内容:服务器在客户端连接上来后会主动发送一个问好的信息,所以这第一 ...
- 一步一步从原理跟我学邮件收取及发送 2.邮箱的登录和绕不开的base64
一步一步从原理跟我学邮件收取及发送 2.邮箱的登录和绕不开的base64 好了,经过本系列上一篇文章 "1.网络命令的发送",假设大家已经掌握了 email 电子邮件的命令发送的方 ...
- 一步一步从原理跟我学邮件收取及发送 4.不同平台下的socket
既然是面向程序员的文章那当然不能只说说原理,一定要有实际动手的操作. 其实作为我个人的经历来说,对于网络编程,这是最重要的一章! 作为一位混迹业内近20年的快退休的程序员,我学习过很多的开发语言 ...
- 一步一步从原理跟我学邮件收取及发送 5.C语言的socket示例
说到 C 语言版本的程序,首先要解决的问题就是兼容性. 作为 20 年开发有 10 多年是在服务端的程序员,我深刻地感受到服务端平台的两极分化之严重,linux 派对 windows 那是超级的不屑一 ...
- 一步一步从原理跟我学邮件收取及发送 10.四句代码说清base64
经过前几篇的文章,大家应该都能预感到一定要讲解 base64 函数的内容了.是的,马上要到程序登录的代码,base64 是必须要实现的. base64 很早以前我就接触了,在项目中也很喜欢用.但每换一 ...
- 一步一步从原理跟我学邮件收取及发送 11.完整的发送示例与go语言
经过了这个系列的前几篇文章的学习,现在要写出一个完整的 smtp 邮件发送过程简直易如反掌. 例如我们可以轻松地写出以下的纯 C 语言代码(引用的其他C语言文件请看文末的 github 地址): ...
- 一步一步从原理跟我学邮件收取及发送 9.多行结果与socket的阻塞
前几篇的文章发表后,有网友留言说没有涉及到阻塞的问题吗?在 socket 的编程当中,这确实是个很重要的问题.结合目前我们文章的内容进度,我们来看看为什么说阻塞概念很重要. 接着上篇的内容,当我们发送 ...
- 一步一步从原理跟我学邮件收取及发送 13.mime格式与常见字符编码
在前面的本系列文章中我们已经学会了邮件的发送和收取.但在收取中我们看到的是一串串的乱码,回忆前面的发送过程,我们会奇怪:我们前面的邮件是明文啊.为什么明文的邮件明明也可以正常工作,还要弄乱码似的字符串 ...
随机推荐
- Java map 详解 - 用法、遍历、排序、常用API等
尊重原创: http://www.cnblogs.com/lzq198754/p/5780165.html 概要: java.util 中的集合类包含 Java 中某些最常用的类.最常用的集合类是 L ...
- 有用的linux命令笔记
date cal [month] [year] bc 计算器 mkdir -p /home/bird/ 连续建立文件夹 mkdir -m 711 test2 创建文件夹是的权限 mv -i 询问是非覆 ...
- 番外篇--Moddule Zero安装
Moddule Zero 安装 1.2.1 从模板创建 使用ABP和module-zero开始一个新项目最简单的方式是使用启动模板.详细了解请参考启动模板文档. 1.2.2 手动安装 如果你有一个预先 ...
- sizeof(extern类型数组)
error: #70: incomplete type is not allowed 用sizeof计算数组大小,编译器提示不允许使用不完整的类型.在keil上编译直接报错,拿到vs2010上编译可 ...
- Web前端性能优化——如何提高页面加载速度
前言: 在同样的网络环境下,两个同样能满足你的需求的网站,一个"Duang"的一下就加载出来了,一个纠结了半天才出来,你会选择哪个?研究表明:用户最满意的打开网页时间是2-5秒, ...
- JS_全
<script src="jquery-1.9.1.js" type="text/javascript"></script> <s ...
- css3图片动画旋转
body{ background-color:#021E36; text-align: center; } .container{margin:500px auto;} .round{position ...
- Lytro 光场相机重对焦C++实现以及CUDA实现
前面有几篇博客主要介绍了光场和光场相机相关知识,以及重对焦效果和多视角效果的展示.算是自己学习光场过程的一种总结. 这次贴上自己用OpenCV/C++编写的重对焦算法实现(包含CPU版和CUDA GP ...
- 【开发技术】常用正则表达式大全!(例如:匹配中文、匹配html)
匹配中文字符的正则表达式: [u4e00-u9fa5] 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内):[^x00-xff] 评注:可以用来计算字符串的长度 ...
- forward和redirect
Forward和Redirect代表了两种请求转发方式:直接转发和间接转发. 直接转发方式(Forward),客户端和浏览器只发出一次请求,Servlet.HTML.JSP或其它信息资源,由第二个信息 ...