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);
}
}