电子邮件收发原理和实现(POP3, SMTP) [整理]

 

电子邮件的收发流程示意图:
电子邮件收发原理和实现(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)        客户端使用TCP协议连接SMTP服务器的25端口;
2)        客户端发送HELO报文将自己的域地址告诉给SMTP服务器;
3)        SMTP服务器接受连接请求,向客户端发送请求账号密码的报文(AUTH LOGIN);
4)        客户端向SMTP服务器传送账号和密码,如果验证成功,向客户端发送一个OK命令,表示可以开始报文传输;
5)        客户端使用MAIL命令将邮件发送者的名称发送给SMTP服务器;
6)        SMTP服务器发送OK命令做出响应;
7)        客户端使用RCPT命令发送邮件接收者地址,如果SMTP服务器能识别这个地址,就向客户端发送OK命令,否则拒绝这个请求;
8)        收到SMTP服务器的OK命令后,客户端使用DATA命令发送邮件的数据。
9)        客户端发送QUIT命令终止连接。

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

*Base64加密使用了Apache的开源包,使用时需导入附件中的commons-codec-1.5.jar包。

 

--------------------------------------------------------------------------------------------------
一些参考资料:
电子邮件检索与传输流程
Email电子邮件应用分析
用Java来编写可根据SMTP和POP3协议来收发E-mail的Java Applet

 

--------------------------------------------------------------------------------------------------

 

你可能感兴趣的:(其他积累)