JavaMail(一)SMTP协议和POP3协议

来源:互联网 发布:掌门集团 知乎 编辑:程序博客网 时间:2024/06/05 09:31

一、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命令的语法及功能描述可以参考RFC821和RFC1869文档,其中<SP>代表空格,<CRLF>代表回车和换行

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

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


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

2 邮箱登录时,用户名和验证码是base64编码后的代码,163的是设置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命令行窗口状态。



附: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




0 0
原创粉丝点击