邮件传输协议(SMTP/POP3)初探
2015-08-26 12:03
549 查看
1、邮件传输协议简介
1.1、SMTP协议
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,属于TCP/IP协议簇。定义邮件发送的通讯规则,用于处理用户smtp请求,将邮件发送到SMTP服务器。
1.2、POP3协议
POP3(Post Office Protocol - Version 3)即邮局协议版本3,属于TCP/IP协议簇。定义邮件接收的通讯规则,负责处理用户的pop3请求,从POP3服务器接收邮件
一句话总结:smtp是用来发送邮件的,pop3是用来接收邮件的。
2、SMTP协议讲解
2.1、SMTP协议发送邮件过程
1.连接SMTP服务器命令:telnet smtp.<服务器地址> 端口,例如:
telnet smtp.139.com 25
2.客户端向服务器发送HELO命令以标识发件人自己的身份
命令:helo <内容>,例如:
helo hello
3.验证登录
命令:
auth login
用户名(BASE64加密,文章结尾提供该加密java帮助类)
密码(BASE64加密,文章结尾提供该加密java帮助类),
4.编辑邮件
命令:data
邮件内容格式:
from:<发送者>
to:<接收者>
subject:<主题>
<空一行>
<正文>
.(不能省略,“.”表示邮件内容结束)
5.断开连接
命令:quit
过程见下图:
现在到邮箱看看结果:
OK!发送成功!
2.2、命令
SMTP命令不区分大小写,但参数区分大小写,有关这方面的详细说明请参考RFC821。常用的命令如下:HELO 。向服务器标识用户身份发送者能欺骗,说谎,但一般情况下服务器都能检测到。
MAIL FROM: 。为发送者地址,此命令用来初始化邮件传输,即用来对所有的状态和缓冲区进行初始化。
RCPT TO:。用来标志邮件接收者的地址,常用在MAIL FROM后,可以有多个RCPT TO。
DATA 。将之后的数据作为数据发送,以.标志数据的结尾。
REST 。重置会话,当前传输被取消。
NOOP 。要求服务器返回OK应答,一般用作测试。
QUIT 。结束会话。
VRFY 。验证指定的邮箱是否存在,由于安全方面的原因,服务器大多禁止此命令。
EXPN 。验证给定的邮箱列表是否存在,由于安全方面的原因,服务器大多禁止此命令。
HELP 。查询服务器支持什么命令。
2.3、响应码
常用的响应如下所示,数字后的说明是从英文译过来的。更详细的说明请参考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操作失败
3、POP3协议
3.1、POP3协议接收邮件过程
1.连接POP3服务器命令:telnet pop3.<服务器地址> 端口,例如:
telnet pop3.139.com 110
2.登录POP3服务器
命令:
user <用户名>(无须base64加密,明文)
pass <密码>(无须base64加密,明文)
3.查看邮箱的统计资料,如邮件总数和总字节数
命令:stat
4.查看参数标识的邮件的全部文本
命令:retr <邮件标识>
过程见下图:
3.2、命令
USER [username] 处理用户名PASS [password] 处理用户密码
APOP [Name,Digest] 认可Digest是MD5消息摘要
STAT 处理请求服务器发回关于邮箱的统计资料,如邮件总数和总字节数
UIDL [Msg#] 处理返回邮件的唯一标识符,POP3会话的每个标识符都将是唯一的
LIST [Msg#] 处理返回邮件数量和每个邮件的大小
RETR [Msg#] 处理返回由参数标识的邮件的全部文本
DELE [Msg#] 处理服务器将由参数标识的邮件标记为删除,由quit命令执行
RSET 处理服务器将重置所有标记为删除的邮件,用于撤消DELE命令
TOP [Msg# n] 处理服务器将返回由参数标识的邮件前n行内容,n必须是正整数
NOOP 处理服务器返回一个肯定的响应
QUIT 终止会话
附:BASE64加密JAVA帮助类
package util; import java.io.IOException; import java.nio.charset.Charset; import Decoder.BASE64Decoder; import Decoder.BASE64Encoder; public class Base64Util { public static String base64Decoder(String inputString,String charsetName) throws IOException{ BASE64Decoder decoder = new BASE64Decoder(); //base64转换成二进制 byte[] bytes = decoder.decodeBuffer(inputString); //按照指定编码构造字符串输出 String outString = new String(bytes,charsetName); return outString; } public static String base64Encoder(String inputString) throws IOException{ BASE64Encoder encoder = new BASE64Encoder(); //按照base64编码输出 String outString = encoder.encode(inputString.getBytes()); return outString; } public static void main(String[] args) throws IOException { String utf = Base64Util.base64Encoder("123456789"); System.out.println(utf); String base64 = Base64Util.base64Decoder(utf, "utf-8"); System.out.println(base64); } }
相关文章推荐
- Apache优化:修改最大并发连接数
- linux多线程编程入门
- linux 开启独立iptables日志
- topcoders 666
- CvMat、Mat、IplImage之间的转换
- CI在CentOS中的部署与实践LNMP
- Centos 6.6 final 安装 xtrabackup 2.2.12 小记
- linux常用命令
- WM_COPYDATA传送指针数据类型的问题
- Apache下Worker模式MPM参数分析
- pring AOP 的简单例子
- linux下android开发真机设备识别不了怎么办
- 介绍几个不错的linux下载站和论坛
- nginx
- eclipse 插件及其配置(jdk+eclipse+svn+maven+jetty+nginx)
- 解决 nginx: [alert] kill(189, 1) failed (3: No such process)
- QTC++监控USB插拔
- Linux shell 字符串常用操作
- willMoveToParentViewController和didMoveToParentViewController
- linux 学习文章