邮件传输协议(SMTP/POP3)初探

时间:2021-08-17 19:03:56

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

过程见下图:

邮件传输协议(SMTP/POP3)初探


邮件传输协议(SMTP/POP3)初探

现在到邮箱看看结果:

邮件传输协议(SMTP/POP3)初探



邮件传输协议(SMTP/POP3)初探

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 <邮件标识>

过程见下图:

邮件传输协议(SMTP/POP3)初探


邮件传输协议(SMTP/POP3)初探

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