邮件协议小结-pop3与smtp - leves

时间:2024-03-04 19:24:54

邮件协议小结-pop3与smtp


tcp/ip协议中,邮件协议可以算是最常用的协议之一了,以前觉得没什么,不就是smtp,pop3嘛,不过接连做了几个相关的项目,才发现这里面的东西还是挺多的。简单写点东西,算是备忘吧,响应李敖老先生的号召:好记性不如烂笔头。^_^
 
我的计划是一共写3~4篇,第一篇介绍smtp及pop3的命令用法,第二篇着重分析smtp的认证机制,第三篇会关注于一些与邮件协议相关的内容,比如反向域名解析,邮件中继,垃圾邮件等,剩下的就一起扔到第四篇里去了。(也不知道能不能写完。。。。^_^)
 
我们平常接触的邮件协议其实主要是两个,smtp(简单邮件传输协议,simple mail transfer protocol的缩写, port 25)以及pop3(邮局协议,post office protocol的缩写,第三版本)。其中smtp协议还有个扩展,叫做esmtp,增加了一些命令以及认证功能。pop3也有下一代协议,叫做imap(互联网邮件访问协议,Internet mail access protocol),imap的功能比pop3更为强大,不光可以接收邮件,还可以对邮箱进行管理。
 
smtp与pop3这两个协议都是明文传输的,为了提高安全性,可以通过ssl进行加密,加密后默认的端口分别为465与995相对于smtp来说,pop3的协议更为简单,这里就先拿pop3来进行介绍
 
[pop3]
邮局协议,顾名思义,就是从邮局中接收邮件的协议,现实生活中,去邮局领包裹需要身份证,而使用
pop3取邮件,首先也必须要身份认证,举个简单的例子,在console窗口中输入以下命令:
 
telnet x.x.x.x 110
+OK CommuniGate Pro POP3 Server 4.1.8 ready <1924775.1140164098@companies.shqp.net.cn>
user yaoj@ideal.sh.cn
+OK please send the PASS
pass xxxxx
+OK 0 messages (0 bytes)
help
+OK Valid commands: QUIT, NOOP, STAT, LIST, UIDL, DELE, RSET, RETR, TOP, LAST,
TND XMIT, HELP
 
可以看到,需要使用邮箱名称作为用户名(注意,有的邮箱之需要@之前的部分即可),以及邮箱密码进行登录,之后可以用help查询可用命令(很多商用邮箱屏蔽了help命令,如sina.com),这些命令中,比较重要的有list(列出邮箱中的邮件),dele x(删除序号为x的邮件),retr x(接收序号为x的邮件,并显示在屏幕上,附件是以base64的编码方式显示,可以用base64的解码工具进行解码)
 
 
[smtp]
简单邮件传输协议,用来在用户客户端与邮件服务器之间传输邮件,我们平常用outlook,outlook
express以及foxmail来发送邮件的时候,就是用的它,先把本机的邮件发送到我们曾注册过邮箱的邮件服务器,比如新浪,163等,然后由服务器再把邮件发送出去。
 
其实,无论是客户端发送给邮件服务器,还是邮件服务器之间的传输,都是用的smtp协议,而且这两者使用的命令其实也基本上都是一样的,当然,现在的服务器基本上都实现了esmtp的认证机制,所以客户端在发送邮件的时候,必须要多一步认证过程。(esmtp的认证留到下次说)
 
还是跟上面一样,举个例子来说明其命令与用法,比如我从本机发一封信到邮件服务器,自己的邮件地址设为新浪,假如对方的邮件服务器没有做反向域名解析(商业邮箱大都有做,企业邮箱大都没做,做有做的好处,不做也有不做的理由,具体的一些细节会在第三篇详述),这封信就会被接收下来。这样的过程其实就是一般邮件服务器之间传输邮件的一个范例,只不过我是伪装的而已。
 

telnet 202.101.10.13 25
220 companies.shgp.net.cn ESMTP CommuniGate Pro 4.1.8 is glad to see you!
helo starvalley
250 companies.shgp.net.cn domain name should be qualified starvalley
mail from:<valley3405@sina.com>
250 valley3405@sina.com sender accepted
rcpt to:<yaoj@ideal.sh.cn>
250 yaoj@ideal.sh.cn will leave the Internet
data
354 Enter mail, end with "." on a line by itself
subject:hello for test
from:<valley3405@sina.com>
to:<yaoj@ideal.sh.cn>
hello for test~
.
250 5398168 message accepted for delivery
quit
221 companies.shgp.net.cn CommuniGate Pro SMTP closing connection
失去了跟主机的连接。

其中重要的命令有
mail from:<valley3405@sina.com>,这是信封发件人。
rcpt to:<yaoj@ideal.sh.cn>,信封收件人
from:<valley3405@sina.com>,发件人
to:<yaoj@ideal.sh.cn>,收件人
注意:smtp协议中有信封发件人,信封收件人,收件人,发件人,其中,带"信封"前缀的的是协议真正关注的,发送的地址以及回复的地址都以这个为准。其实也很容易理解,邮递员在送邮件的时候也只会看信封上的地址,谁管你在信里面写些什么

data:标志着邮件正文开始,以下部分,直到带有点的空行出现,都会被包含在正文内,这里我们可以看到,正文内其实是包含主题(subject),收件人,发件人的,只是有关键字开头而已。
.:标志邮件正文结束