电子邮件的收发流程示意图:

电子邮件收发原理和实现(POP3, SMTP)_第1张图片

电子邮件收发原理和实现(POP3, SMTP)_第2张图片

相对于邮件客户端的流程就是:

电子邮件收发原理和实现(POP3, SMTP)_第3张图片

邮件接收——POP3协议
POP3(Post Office Protocol 3,邮局协议版本3)主要用于支持使用客户端远程管理在服务器上的电子邮件。该协议是在RFC-1939中定义的,是Internet上的大多数人用来接收邮件的机制。POP3采用Client/Server工作模式,默认使用TCP 110端口。

  • 在使用POP协议时,人们熟悉的很多功能,如查看收到了多少新邮件消息的功能,POP根本不支持。这些功能都内置到诸如Eudora或 Microsoft Outlook之类的邮件程序中,能为您记住接收的上一封邮件,以及计算有多少新邮件这类信息。因此,如果想获取这类信息,将需要由自己进行计算。
    [详细请参考wiki的解析:http://zh.wikipedia.org/wiki/POP3 ]


电子邮件收发原理和实现(POP3, SMTP)_第4张图片


电子邮件收发原理和实现(POP3, SMTP)_第5张图片

  • 对大小写不敏感,以CRLF作为结束
    [详细可参考RFC1939协议,http://www.rfc-ref.org/RFC-TEXTS/1939/contents.html ]

命令可能的返回值

  • OK <描述> 成功
  • ERR <描述> 失败


1) 客户端使用TCP协议连接邮件服务器的110端口;
2) 客户端使用USER命令将邮箱的账号传给POP3服务器;
3) 客户端使用PASS命令将邮箱的账号传给POP3服务器;
4) 完成用户认证后,客户端使用STAT命令请求服务器返回邮箱的统计资料;
5) 客户端使用LIST命令列出服务器里邮件数量;
6) 客户端使用RETR命令接收邮件,接收一封后便使用DELE命令将邮件服务器中的邮件置为删除状态;
7) 客户端发送QUIT命令,邮件服务器将将置为删除标志的邮件删除,连接结束。
(注:客户端UA可以设定将邮件在邮件服务器上保留备份,而不将其删除。)

一个基本实现(Java):
Pop3Test.java (见附件)

邮件发送——SMTP协议
SMTP(Simple Message Transfer Protocol,简单邮件传输协议)是用于传送电子邮件的机制。该协议是在RFC-821中定义的。采用Client/Server工作模式,默认使用TCP 25端口。
[详细请参考wiki的解析:http://zh.wikipedia.org/wiki/SMTP ]


电子邮件收发原理和实现(POP3, SMTP)_第6张图片


电子邮件收发原理和实现(POP3, SMTP)_第7张图片

  • 对大小写不敏感,以CRLF作为结束
    [详细可参考RFC821协议,中文版链接地址:http://www.5dmail.net/rfc/RFC821.txt ]

命令可能的返回值
500 格式错误,命令不可识别(此错误也包括命令行过长)
501 参数格式错误
502 命令不可实现
503 错误的命令序列
504 命令参数不可实现
211 系统状态或系统帮助响应
214 帮助信息
220 服务就绪
221 服务关闭传输信道
421 服务未就绪,关闭传输信道(当必须关闭时,此应答可以作为对任何命令的响应)
250 要求的邮件操作完成
251 用户非本地,将转发向
450 要求的邮件操作未完成,邮箱不可用(例如,邮箱忙)
550 要求的邮件操作未完成,邮箱不可用(例如,邮箱未找到,或不可访问)
451 放弃要求的操作;处理过程中出错
551 用户非本地,请尝试
452 系统存储不足,要求的操作未执行
552 过量的存储分配,要求的操作未执行
553 邮箱名不可用,要求的操作未执行(例如邮箱格式错误)
354 开始邮件输入,以.结束
554 操作失败

1.2. 几个术语
1.2.1. 邮件

邮件是一种消息的格式,由信封、首部和正文组成。

信封上最重要的是收信人的地址。邮件服务器用这个地址将邮件发送到收信人所在的邮件服务器上。

首部是由用户代理或邮件服务器添加的一些信息。包括Received、Message-ID、From、Data、Reply-To、X-Phone、X-Mailer、To和Subject等字段。

正文是是发送用户发给接收用户报文的内容。RFC 822 规定正文为NVT ASCII文字行。

更为详细的说明,请参考RFC821和RFC822等协议。

1.2.2. 用户代理
用户代理UA(User Agent)是用户与电子邮件系统的交互接口,一般来说它就是我们PC机上的一个程序。Windows上常见的用户代理是Foxmail和Outlook Express。

用户代理提供一个好的用户界面,它提取用户在其界面填写的各项信息,生成一封符合SMTP等邮件标准的邮件,然后采用SMTP协议将邮件发送到发送端邮件服务器。

1.2.3. 邮件服务器
邮件服务器是电子邮件系统的核心,它用来发送和接收邮件。邮件服务器不同于普通PC的是它几乎是全天工作的,所以它可以在任何时候为用户提供服务,后面将提到这正是为什么需要邮件服务器的一个重要原因。很多ISP都提供免费的邮件服务器,如126提供smtp.126.com邮件服务器。

邮件服务器向其它邮件服务器转发邮件也是采用SMTP协议。
1.2.4. SMTP和邮件格式的关系
如前所述,SMTP是客户机向服务器发送邮件时所使用的协议,其核心是2.2中所述的命令和响应,至于它命令和响应中所带的参数采用什么格式,则是依赖于其他标准的。例如DATA后所带的参数,则应遵循邮件格式标准RFC822.

SMTP和邮件格式的关系可用这么一个例子来说明。甲与乙书信往来,甲通过邮局向乙发信,邮局间转交邮件可看成使用了SMTP协议,至于书信的格式则会因为地区习惯等的不同而不同(中国人的书信格式和美国人的书信格式不同),这个书信格式则可看成是邮件格式标准。

应当认识到不能孤立地看待协议,各个协议之间往往存在着耦合关系,但为了分析方便,我们在具体叙述某个协议时,只能抓住主要矛盾——主要阐述单个协议。

1.2.5. 浏览器发送邮件用的什么协议
浏览器如IE、Maxthon可通过登陆用户邮箱,来收发邮件,这是怎样实现的?例如[email protected]可通过登陆www.126.com来收发邮件。

这个过程是这样的:[email protected]在www.126.com提供的邮件页面上填写的相应信息(如发信人邮箱、收信人邮箱等),通过http协议被提交给126服务器;126服务器根据这些信息组装一封符合邮件规范的邮件(就像用户代理一样);然后smtp.126.com通过SMTP协议将这封邮件发送到接收端邮件服务器。

可以看出,浏览器发送邮件只是用户代理的功能直接放到邮件服务器上去做了,至于邮件服务器间发送邮件还是采用的SMTP协议。我们看问题,如果有必要还是要适当地透过现象看本质。

1.3. 邮件的收发过程
一般情况下,一封邮件的发送和接收过程如下。

1) 发信人在用户代理里编辑邮件,包括填写发信人邮箱、收信人邮箱和邮件标题等等。

2) 用户代理提取发信人编辑的信息,生成一封符合邮件格式标准(RFC822)的邮件。

3) 用户代理用SMTP将邮件发送到发送端邮件服务器(即发信人邮箱所对应的邮件服务器)。

4) 发送端邮件服务器用SMTP将邮件发送到接收端邮件服务器(即收信人邮箱所对应的邮件服务器)。

5) 收信人调用用户代理。用户代理用POP3协议从接收端邮件服务器取回邮件。

6) 用户代理解析收到的邮件,以适当的形式呈现在收信人面前。

第2章. SMTP详解


SMTP,即简单邮件传送协议,所对应RFC文档为RFC821。同http等多数应用层协议一样,它工作在C/S模式下,用来实现因特网上的邮件传送。SMTP在整个电子邮件通信中所处的位置如图 1所示。

电子邮件收发原理和实现(POP3, SMTP)
可以看出,SMTP是用来将客户机上的邮件传送到服务器上。这里的客户机是指某次连接中的发送方,服务器是指相应的接收方。在讲解发送邮件的整个通信过程前,先解释一下面几个术语。
2.1. 通信过程
一个具体的SMTP通信(如发送端邮件服务器与接收端服务器的通信)的过程如下。

1) 发送端邮件服务器(以下简称客户端)与接收端邮件服务器(以下简称服务器)的25号端口建立TCP连接。

2) 客户端向服务器发送各种命令,来请求各种服务(如认证、指定发送人和接收人)。

3) 服务器解析用户的命令,做出相应动作并返回给客户端一个响应。

4) 2)和3)交替进行,直到所有邮件都发送完或两者的连接被意外中断。

从这个过程看出,命令和响应是SMTP协议的重点,下面将予以重点讲述。

2.2. 命令和响应
2.2.1. 格式
SMTP的命令不多(14个),它的一般形式是:COMMAND [Parameter] 。其中COMMAND是ASCII形式的命令名,Parameter是相应的命令参数,是回车换行符(0DH, 0AH)。

SMTP的响应也不复杂,它的一般形式是:XXX Readable Illustration。XXX是三位十进制数;Readable Illustration是可读的解释说明,用来表明命令是否成功等。XXX具有如下的规律:以2开头的表示成功,以4和5开头的表示失败,以3开头的表示未完成(进行中)。

2.2.2. 一个例子
命令和响应的格式是语法,各命令和响应的意思则是语义,各命令和各响应在时间上的关系则是同步。下面将通过一个简单的SMTP通信过程来说明协议的这三个要素。

C:telnet smtp.126.com 25 / 以telnet方式连接126邮件服务器 /

S:220 126.com Anti-spam GT for Coremail System (126com[071018]) / 220为响应数字,其后的为欢迎信息,会应服务器不同而不同/

C:HELO smtp.126.com / HELO 后用来填写返回域名(具体含义请参阅RFC821),但该命令并不检查后面的参数/

S:250 OK

C: MAIL FROM: [email protected] / 发送者邮箱 /

S:250 … ./ “…”代表省略了一些可读信息 /

C:RCPT TO: [email protected] / 接收者邮箱 /

S:250 … ./ “…”代表省略了一些可读信息 /

C:DATA / 请求发送数据 /

S:354 Enter mail, end with "." on a line by itself

C:Enjoy Protocol Studing

C:.

S:250 Message sent

C:QUIT / 退出连接 /

S:221 Bye

分析上面的过程可参考注释进行,这里要补充如下几点。

1) “C:”开头的行(不包括"C:")是客户端的输入,而以“S:”开头的行(不包括"S:")则是服务器的输出。

2) 上述的命令并不一定会一次性成功,服务器会返回错误响应,客户端应该按照协议规定的时序,来输入后续的命令(或重复执行失败的命令,或重置会话,或退出会话等等)。

2.2.3. 常用命令
SMTP命令不区分大小写,但参数区分大小写,有关这方面的详细说明请参考RFC821。常用的命令如下。

HELO 。向服务器标识用户身份发送者能欺骗,说谎,但一般情况下服务器都能检测到。

MAIL FROM: 为发送者地址,此命令用来初始化邮件传输,即用来对所有的状态和缓冲区进行初始化。

RCPT TO: 。 用来标志邮件接收者的地址,常用在MAIL FROM后,可以有多个RCPT TO。

DATA 。将之后的数据作为数据发送,以.标志数据的结尾。

REST 。重置会话,当前传输被取消。

NOOP 。要求服务器返回OK应答,一般用作测试。

QUIT 。结束会话。

VRFY 。验证指定的邮箱是否存在,由于安全方面的原因,服务器大多禁止此命令。

EXPN 。验证给定的邮箱列表是否存在,由于安全方面的原因,服务器大多禁止此命令。

HELP 。查询服务器支持什么命令。

2.2.4. 常用响应
常用的响应如下所示,数字后的说明是从英文译过来的。更详细的说明请参考RFC821。

501参数格式错误

502命令不可实现

503错误的命令序列

504命令参数不可实现

211系统状态或系统帮助响应

214帮助信息

220<domain>服务就绪

221<domain>服务关闭

421<domain>服务未就绪,关闭传输信道

250要求的邮件操作完成

251用户非本地,将转发向<forward-path>

450要求的邮件操作未完成,邮箱不可用

550要求的邮件操作未完成,邮箱不可用

451放弃要求的操作;处理过程中出错

551用户非本地,请尝试<forward-path>

452系统存储不足,要求的操作未执行

552过量的存储分配,要求的操作未执行

553邮箱名不可用,要求的操作未执行

354开始邮件输入,以"."结束

554操作失败

转自:https://blog.csdn.net/ly930156123/article/details/51657509
转自:http://univasity.iteye.com/blog/1173296