电子邮件收发原理和实现(POP3, SMTP) [整理]
2014-11-21 16:53
316 查看
转自:http://univasity.iteye.com/blog/1173296
电子邮件的收发流程示意图:
![](http://dl.iteye.com/upload/attachment/555092/f705e936-5a43-3daa-bc3d-420620d46626.gif)
![](http://dl.iteye.com/upload/attachment/555094/5b5f592f-361b-3c05-b8d4-b42624f7529a.png)
相对于邮件客户端的流程就是:
![](http://dl.iteye.com/upload/attachment/555096/c74b5f8d-a415-305a-a8ff-b98ad0bd128f.png)
邮件接收——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状态图>
![](http://dl.iteye.com/upload/attachment/555098/ff39d70f-5685-3c91-a993-8baffd3fb5d6.png)
<POP3常用命令表>
![](http://dl.iteye.com/upload/attachment/555100/accc949f-8562-394f-ac25-ff1b5bf13465.png)
* 对大小写不敏感,以CRLF作为结束
[详细可参考RFC1939协议,http://www.rfc-ref.org/RFC-TEXTS/1939/contents.html ]
>> 命令可能的返回值
+ OK <描述> 成功
- ERR <描述> 失败
<POP3工作原理>
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 ]
<SMTP状态图>
![](http://dl.iteye.com/upload/attachment/555102/90c7d332-78cb-3fc6-bc81-876f8f83c1ae.png)
<SMTP常用命令表>
![](http://dl.iteye.com/upload/attachment/555104/2773e3a4-23df-31f1-a890-3e5172348639.png)
* 对大小写不敏感,以CRLF作为结束
[详细可参考RFC821协议,中文版链接地址:http://www.5dmail.net/rfc/RFC821.txt ]
>> 命令可能的返回值
500 格式错误,命令不可识别(此错误也包括命令行过长)
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 开始邮件输入,以<CRLF>.<CRLF>结束
554 操作失败
<SMTP工作原理>
1) 客户端使用TCP协议连接SMTP服务器的25端口;
2) 客户端发送HELO报文将自己的域地址告诉给SMTP服务器;
3) SMTP服务器接受连接请求,向客户端发送请求账号密码的报文(AUTH LOGIN);
4) 客户端向SMTP服务器传送账号和密码,如果验证成功,向客户端发送一个OK命令,表示可以开始报文传输;
5) 客户端使用MAIL命令将邮件发送者的名称发送给SMTP服务器;
6) SMTP服务器发送OK命令做出响应;
7) 客户端使用RCPT命令发送邮件接收者地址,如果SMTP服务器能识别这个地址,就向客户端发送OK命令,否则拒绝这个请求;
8) 收到
4000
SMTP服务器的OK命令后,客户端使用DATA命令发送邮件的数据。
9) 客户端发送QUIT命令终止连接。
电子邮件的收发流程示意图:
![](http://dl.iteye.com/upload/attachment/555092/f705e936-5a43-3daa-bc3d-420620d46626.gif)
![](http://dl.iteye.com/upload/attachment/555094/5b5f592f-361b-3c05-b8d4-b42624f7529a.png)
相对于邮件客户端的流程就是:
![](http://dl.iteye.com/upload/attachment/555096/c74b5f8d-a415-305a-a8ff-b98ad0bd128f.png)
邮件接收——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状态图>
![](http://dl.iteye.com/upload/attachment/555098/ff39d70f-5685-3c91-a993-8baffd3fb5d6.png)
<POP3常用命令表>
![](http://dl.iteye.com/upload/attachment/555100/accc949f-8562-394f-ac25-ff1b5bf13465.png)
* 对大小写不敏感,以CRLF作为结束
[详细可参考RFC1939协议,http://www.rfc-ref.org/RFC-TEXTS/1939/contents.html ]
>> 命令可能的返回值
+ OK <描述> 成功
- ERR <描述> 失败
<POP3工作原理>
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 ]
<SMTP状态图>
![](http://dl.iteye.com/upload/attachment/555102/90c7d332-78cb-3fc6-bc81-876f8f83c1ae.png)
<SMTP常用命令表>
![](http://dl.iteye.com/upload/attachment/555104/2773e3a4-23df-31f1-a890-3e5172348639.png)
* 对大小写不敏感,以CRLF作为结束
[详细可参考RFC821协议,中文版链接地址:http://www.5dmail.net/rfc/RFC821.txt ]
>> 命令可能的返回值
500 格式错误,命令不可识别(此错误也包括命令行过长)
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 开始邮件输入,以<CRLF>.<CRLF>结束
554 操作失败
<SMTP工作原理>
1) 客户端使用TCP协议连接SMTP服务器的25端口;
2) 客户端发送HELO报文将自己的域地址告诉给SMTP服务器;
3) SMTP服务器接受连接请求,向客户端发送请求账号密码的报文(AUTH LOGIN);
4) 客户端向SMTP服务器传送账号和密码,如果验证成功,向客户端发送一个OK命令,表示可以开始报文传输;
5) 客户端使用MAIL命令将邮件发送者的名称发送给SMTP服务器;
6) SMTP服务器发送OK命令做出响应;
7) 客户端使用RCPT命令发送邮件接收者地址,如果SMTP服务器能识别这个地址,就向客户端发送OK命令,否则拒绝这个请求;
8) 收到
4000
SMTP服务器的OK命令后,客户端使用DATA命令发送邮件的数据。
9) 客户端发送QUIT命令终止连接。
相关文章推荐
- 电子邮件收发原理和实现(POP3, SMTP) [整理]
- 邮件收发原理(POP3/SMTP)
- Java基于smtp与pop3实现收发邮件的功能
- 使用SMTP 和POP3 协议实现收发邮件(C/C++)
- 使用SMTP 和POP3 协议实现收发邮件(C/C++)
- 使用SMTP 和POP3 协议实现收发邮件(C/C++)
- 电子邮件收发原理和实现(转载)
- 用Delphi实现邮件附件收发功能(使用Pop3 和Smtp)
- 使用SMTP 和POP3 协议实现收发邮件(C/C++) (转)
- c#中邮件收发处理(POP3,IMAP,SMTP)的实现方法
- indy的smtp和pop3收发邮件过程中怎样实现进度条
- 使用SMTP 和POP3 协议实现收发邮件(C/C++)
- SMTP/POP3 收发协议分析集
- Windows Live Mail 现在可以通过 POP3 和 SMTP 接收和发送电子邮件了的
- [整理]二分查找搜索算法原理及递归,迭代方法实现
- c#中邮件收发处理(POP3,IMAP,SMTP)
- 收发Web mail邮箱邮件实现原理
- 邮箱收发服务器(pop3\smtp)设置
- 什么是POP3和SMTP?如何用命令行来收发邮件。
- SMTP/POP3收发Domino邮件