典型的邮件传输协议有POP3、SMTP、IMAP及HTTP。
其中HTTP算不上标准的邮件协议,只是说有很多邮件系统只提供web方式收发邮件而已。
SMTP/POP3是一套配对的协议,SMTP是用来发送邮件的,目前所有的邮件服务器发送系统其实采用的协议都是SMTP协议。
POP3协议是收取邮件的协议,用来从服务器上收取属于自己的邮件。
IMAP协议是邮件管理协议,能够对自己的位于邮件服务器上的邮件进行阅读、删除甚至发送的协议,这里的发送并不是真正的发送,只是将要发送的邮件提交到自己的邮件服务器的发送队列中。
典型的邮件发送过程是这样的:
所以说,邮件发送接收的过程其实有三步:
1、客户端通过SMTP或者IMAP协议和自己的邮件服务器通信,将要发送的数据提交给自己的邮件服务器
2、发送方和接收方邮件服务器通过SMTP协议将邮件传输到接收方邮件服务器上
3、接收端通过POP3/IMAP/HTTP就可以自己的服务器上收取到邮件
这里我们说的是正常情况下的邮件发送的步骤,在实际情况下还存在一些特殊情况,如:
1、发送方和接收方是处于同一个邮件域或者同一个邮件服务器上,此时并不需要使用SMTP协议进行邮件传递,只需要邮件服务器自己直接通过自己的方式实现即可(文件复制或者数据库读写等)
2、发送方不是和自己的邮件服务器打交道,而是直接和接收方邮件服务器进行通话,直接让对方邮件服务器为你将邮件发送到目标信箱。
3、发送方和第三方的邮件服务器打交道,拜托它帮忙将邮件发送到其他邮件服务器上。
对于特殊情况1来说,没有任何问题,对于特殊情况2和3来说呢,门道可多啦。
其实,特殊情况2这种方式,就是Foxmail中所谓的“特快专递”邮件,使用这种方式,如果成功就基本能很确认邮件已经被投递到收件人的邮箱了(但是很多时候是无法成功的)
而特殊情况3,则是很久以前的垃圾邮件发送者的使用伎俩了。
由于垃圾邮件的泛滥,在几年前(大约2001年吧),相信大家都听过,国内的邮件服务器被大量封杀。也就在那个阶段,邮件服务器的安全性能开始慢慢的增强,各种防范垃圾邮件的软件方法也开始部署到服务器上。
1、禁止邮件服务器做“义工”,不再投递发送者不属于本邮件域的邮件。即特殊情况3,这个很简单,单纯的一个判断就可以了。
2、实施发信认证。以往只有在收取邮件的时候才需要进行认证(进行这个认证是很正常的,否则邮箱就能被任何人收取了)。现在对发送邮件也进行了认证,就是当发送邮件的时候,邮件服务器会验证发件人所使用的邮箱是否是的该发件人所拥有。在技术上,由SMTP协议升级到ESMTP协议。即使用EHLO替代了HELO。
3、收件服务器对接收到的邮件来源服务器进行认证。ESMTP协议可以用到客户端和自己的邮件服务器上,因为该邮件服务器肯定拥有发件邮箱的所有信息。但是却无法应用到邮件服务器之间的邮件传送,因为他没有办法去获取对方服务器的认证(很明显,一个Gmail.com的用户A给Hotmail.com的一个用户B发送邮件,Hotmail.com的邮件服务器接收到Gmail.com传来的邮件的时候是没有办法确认该邮件是不是由A来发送的,他没有办法得到Gmail.com上的用户A的认证信息)。
那么怎么办呢?难道真的没有办法了吗?有。最可靠的办法就是邮件域的反向解析。许多限制严格的邮件服务器只有在反相解析确定所接收的邮件是属于其邮件服务器时才会接收。但是这样做会耗费比较多的资源,目前还有一个办法就还是最土的IP地址认证机制(如Gmail.com使用的就是这个,在使用Foxmail的特快转递收到信件的邮件头内会包含类似下面的内容Received-SPF: neutral (google.com: 125.34.201.193 is neither permitted nor denied by best guess record for domain of xxxxx@xxxxx.com) client-ip=125.34.201.193;),如果发送人邮件没有在禁止IP范围内,则允许接收,否则就屏蔽。
好,这些就是邮件SMTP协议的最表层的一些理解了,下面用几个稍具专业的东西来结束这篇文章。
1、同SMTP/ESMTP相关的几个RFC协议:RFC 821、RFC 1869、RFC 2554
2、标准的Smtp协议交互内容如下
S:
C:
S:220 standard smtp Mail Server Ready...
C:HELO XXX
S:250 OK
C:MAIL FROM:Sender
S:250 OK
C:RCPT TO:Receiver Receiver@XXX.com
S:250 OK
C:DATA
S:354 Start mail input; end with .
C:XXXXXXXX
C:XXXXXXXX
C:.
S:250 OK
C:QUIT
S:221 Bye
支持认证的SMTP(ESMTP)协议交互内容如下:
S:
C:
S:220 esmtp with Authentication Mail Server Ready...
C:EHLO XXX
S:250-SMTP.XXX.COM
S:250 AUTH LOGIN
C:AUTH LOGIN
S:334 VXNlcm5hbWU6
C:VXNlcm5hbWU6
S:334 UGFzc3dvcmQ6
C:UGFzc3dvcmQ6535
S:235 Authentication successful
C:MAIL FROM:Sender
S:250 OK
C:RCPT TO:Receiver Receiver@XXX.com
S:250 OK
C:DATA
S:354 Start mail input; end with .
C:XXXXXXXX
C:XXXXXXXX
C:.
S:250 OK
C:QUIT
S:221 Bye
3、典型的ESMTP邮件发送流程图
邮件发送流程:
S: 我这个邮政局是顾客上门才服务,我不上门接快递的
C: >>敲门
S:220 esmtp with Authentication Mail Server Ready... 你好,邮政局营业中
C:EHLO XXX >>你好
S:250-SMTP.XXX.COM 噢,我是XXX.com邮政局
S:250 AUTH LOGIN 250啊,我需要认证
C:AUTH LOGIN >>那么就开始认证吧
S:334 VXNlcm5hbWU6 说出你的用户名(Base64编码的)
C:VXNlcm5hbWU6 >>我BASE64编码的用户名是VXNlcm5hbWU6
S:334 UGFzc3dvcmQ6 说出你的密码
C:UGFzc3dvcmQ6535 >>我BASE64编码的密码是UGFzc3dvcmQ6535
S:235 Authentication successful 你认证通过了
C:MAIL FROM:Sender >>我的这封邮件是从Sender发送的
S:250 OK 好的,没问题
C:RCPT TO:Receiver >>将他发送给Receiver
S:250 OK 好的,没问题
C:DATA >>下面我说邮件内容了啊
S:354 Start mail input; end with . 成,开始吧,结束的时候记得用“回车换行+小数点+回车换行”噢
C:XXXXXXXX >>书写邮件中
C:XXXXXXXX
C:. >>回车换行+小数点+回车换行
S:250 OK 成,邮件开始发送了
C:QUIT >>好,那么谢谢了,我就走了
S:221 Bye Good Bye
From:落伍 http://www.im286.com/thread-3125586-1-1.html