JavaMail(一)SMTP协议和POP3协议

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

一、SMTP协议


Simple Mail Transfer Protocol,简单邮件传输协议。SMTP协议属于TCP/IP协议族,通信双方采用一问一答的命令/响应形式进行对话,且定了对话的规则和所有命令/响应的语法格式。

 

SMTP命令格式 说明
ehlo<SP><domain><CRLF>        ehlo命令是SMTP邮件发送程序与SMTP邮件接收程序建立连接后必须发送的第一条SMTP命令,参数<domain>表示SMTP邮件发送者的主机名。
ehlo命令用于替代传统SMTP协议中的helo命令。
auth<SP><para><CRLF>       如果SMTP邮件接收程序需要SMTP邮件发送程序进行认证时,它会向SMTP邮件发送程序提示它所采用的认证方式,SMTP邮件发送程序接着应该使用这个命令回应SMTP邮件接收程序,参数<para>表示回应的认证方式,通常是SMTP邮件接收程序先前提示的认证方式。
mail<SP>From:<reverse-path><CRLF>     此命令用于指定邮件发送者的邮箱地址,参数<reverse-path>表示发件人的邮箱地址
rcpt<SP>To:<forword-path><CRLF>      此命令用于指定邮件接收者的邮箱地址,参数<forward-path>表示接收者的邮箱地址。如果邮件要发送给多个接收者,那么应使用多条rcpt<SP>To命令来分别指定每一个接收者的邮箱地址。
data<CRLF>      此命令用于表示SMTP邮件发送程序准备开始输入邮件内容,在这个命令后面发送的所有数据都将被当做邮件内容,直至遇到“<CRLF>.<CRLF>"标志符,则表示邮件内容结束。
quit<CRLF>     此命令表示要结束邮件发送过程,SMTP邮件接收程序接收到此命令后,将关闭与SMTP邮件发送程序的网络连接。

其它SMTP命令的语法及功能描述可以参考RFC821RFC1869文档,其中<SP>代表空格,<CRLF>代表回车和换行

邮件发送需要通过发送服务器(SMTP)服务器发送邮件,通过接收服务器(POP3)接收邮件。SMTP服务器默认端口号25,POP3默认端口号为110。 

通过telnet采用163邮箱模拟邮件发送

JavaMail(一)SMTP协议和POP3协议

注:1 与服务器打招呼,ehlo xxx 后面的的词可以随意填写。

2 邮箱登录时,用户名和验证码是base64编码后的代码,163的是设置SMTP,POP3服务的验证码,不是登陆密码

JavaMail(一)SMTP协议和POP3协议

3 data邮件内容, 直接发送内容是显示发送成功, 但是目标邮箱可能会没有接收到, 因为邮件内容没有采用标准的格式,可能会被当垃圾邮件处理,自动过滤掉。

data内容标准模板

data
from:chenxingxing745@163.com
to:chenjiaren745@163.com
subject:this is my second email

this is the content
.

二、POP3协议


POP3(Post Office Protocol 邮局协议的第三版本)  SMTP服务器将接收到的电子邮件保存到相应用户的电子邮箱中

POP3命令格式 说明
user<SP>username<CRLF>       user 命令是POP3客户端程序与POP3邮件服务器建立连接后通常发送的第一条命令,参数 username 表示收件人的帐户名称。
pass<SP>password<CRLF>       pass 命令是在user命令成功通过后,POP3客户端程序接着发送的命令,它用于传递帐户的密码,参数 password 表示帐户的密码。
apop<SP>name,digest<CRLF>       apop 命令用于替代user和pass命令,它以MD5 数字摘要的形式向POP3邮件服务器提交帐户密码。
stat<CRLF>      stat 命令用于查询邮箱中的统计信息,例如:邮箱中的邮件数量和邮件占用的字节大小等。
uidl<SP>msg#<CRLF>      uidl 命令用于查询某封邮件的唯一标志符,参数msg#表示邮件的序号,是一个从1开始编号的数字。
list<SP>[MSG#]<CRLF>      list 命令用于列出邮箱中的邮件信息,参数 msg#是一个可选参数,表示邮件的序号。当不指定参数时,POP3服务器列出邮箱中所有的邮件信息;当指定参数msg#时,POP3服务器只返回序号对应的邮件信息。
retr<SP>msg#<CRLF>     retr 命令用于获取某封邮件的内容,参数 msg#表示邮件的序号。
dele<SP>msg#<CRLF>     dele 命令用于在某封邮件上设置删除标记,参数msg#表示邮件的序号。POP3服务器执行dele命令时,只是为邮件设置了删除标记,并没有真正把邮件删除掉,只有POP3客户端发出quit命令后,POP3服务器才会真正删除所有设置了删除标记的邮件。
rest<CRLF>     rest 命令用于清除所有邮件的删除标记。
top<SP>msg#<SP>n<CRLF>     top 命令用于获取某封邮件的邮件头和邮件体中的前n行内容,参数msg#表示邮件的序号,参数n表示要返回邮件的前几行内容。使用这条命令以提高 Web Mail系统(通过Web站点上收发邮件)中的邮件列表显示的处理效率,因为这种情况下不需要获取每封邮件的完整内容,而是仅仅需要获取每封邮件的邮件头信息。
noop<CRLF>     noop 命令用于检测POP3客户端与POP3服务器的连接情况。
quit<CRLF>     quit 命令表示要结束邮件接收过程,POP3服务器接收到此命令后,将删除所有设置了删除标记的邮件,并关闭与POP3客户端程序的网络连接。

<SP>代表空格,<CRLF>代表回车和换行


交互过程: 1、首先用tlenet程序连接到163的pop3邮箱,telnet pop3.163.com 110。 2、执行user命令指定用户名,user xyang0917。 3、执行pass命令输入密码,pass 123456abc。 验证成功后,提示邮箱中有一封邮件,占1822字节邮箱空间。 4、执行stat命令统计邮箱中的信息,结果显示邮箱中有一封邮件,占1822字节的邮箱空间。 5、执行list命令列出邮箱中的所有邮件,结果显示1 1822,1代表邮件编号,1822代表邮件的大小,如果有多封邮件,编号从1开始向上累加依次列出来。 6、执行retr 1命令查看第一封邮件的内容。 7、执行dele 1命令将第一封邮件设置删除标志。 8、执行rset命令重置所有邮件的删除标志。 9、执行quit命令退出邮件接收程序,POP3服务器接收到客户端发送的quit命令后,将删除所有设置了删除标记的邮件,并断开与客户端的网络连接。并且Telnet程序自动结束运行,退回到Window命令行窗口状态。 JavaMail(一)SMTP协议和POP3协议



附:base编码代码

package cjr.other;

import sun.misc.BASE64Encoder;

public class Base64Code {

public static void main(String[] args) {
String userName = "chenxingxing745@163.com";
String pwd = "sadsadsyguydsad";
BASE64Encoder encoder = new BASE64Encoder();
System.out.println(encoder.encode(userName.getBytes()));
System.out.println(encoder.encode(pwd.getBytes()));
}
}


参考: http://892848153.iteye.com/blog/1724591