电子邮件接收程序 2.docx
《电子邮件接收程序 2.docx》由会员分享,可在线阅读,更多相关《电子邮件接收程序 2.docx(11页珍藏版)》请在冰豆网上搜索。
电子邮件接收程序2
网络编程技术
课程设计报告
专业
计算机科学与技术
学生姓名
朱虹
班级
B计算机111
学号
1110704129
指导教师
胡波
完成日期
2014年7月4日
信息工程学院
题目:
电子邮件接收程序
1.概述
POP3(PostOfficeProtocolVersion3),即邮局办公协议,该协议用于接收邮件的双方(客户机、POP3服务器)进行通信。
使用该协议,用户可以脱机阅读信件,而不必把客户机长期连接到网络上,以减少网络费用。
POP3协议允许用户以一定的方式从保存邮件的服务器(即POP3服务器)上取走自己的邮件。
2.设计原理
POP允许客户端连接到服务器并下载所有的邮件到客户机上的邮箱。
POP3邮件服务器通过侦听TCP端口110提供POP3服务。
客户端软件读取邮件之前,需要先与服务器建立TCP连接。
连接成功后,POP3服务器会向该客户端发送确认消息。
然后客户端根据服务器回送的信息决定下一步的操作。
客户端每次向POP3服务器发送命令后,都要等待服务器响应,并处理接受的信息,然后再接着发送下一个命令,如此反复多次,一直持续到断开连接。
这个过程经历了3个状态:
授权(AUTHORIZATION)状态、操作(TRANSACTION)状态和更新(UPDATE)状态。
在POP3协议中,规定的命令只有十几条。
每条命令均由命令和参数两部分组成,而且每条命令都以回车换行结束。
命令和参数之间空格隔开。
命令部分由3至4个字母组成,参数部分最多可达40个字符长度。
POP3服务器回送的响应信息由一个状态码和一个可能跟有附加消息的字符串组成。
状态码有两种:
“确定”和“失败”。
该模型基本原理为:
POP3接收者对POP3发送者进行初始化连接,发送者对接收者发送询问指令“READY”,接收者则向发送者提交所要接收数据的要求,发送者做出回应,并发送数据。
接收者则开始接收数据。
发送者发送完数据后,提出断开请求,并断开连接。
数据接收过程完成。
POP3的状态转换示意图
3.详细设计及编码
1.授权状态
客户端首先与POP3服务器建立TCP连接,服务器接收后发送一个单行的确认信息。
假设用C表示客户端(Client),S表示服务器端(Server),下面是客户端接收邮件前需要与服务器传输的信息。
(1)发送用户名
命令格式:
USER<用户名>,该命令将客户的用户名发送到服务器,服务器返回“OK”表示正确的用户名,“-ERR”表示错误的用户名。
(2)用户名确认成功后,需要输入密码
命令格式:
PASS<密码>,该命令将客户的密码发送给服务器。
服务器返回“OK”表示正确的密码,“-ERR”表示错误的密码。
2.操作状态
客户端将服务器成功确认了自己的身份后,POP3会话将进入操作状态,然后客户端就可以执行POP3命令进行相应的操作。
(1)STAT命令
命令格式:
STAT,该命令从服务器中获取邮件总数和总字节数,服务器响应命令返回邮件总数和总字节数。
(2)LIST命令
命令格式:
LIST,该命令从服务器中获得邮件列表和大小。
服务器响应命令返回邮件列表和大小。
(3)RETR命令
命令格式:
RETR命令,该命令从服务器中获得一个邮件
(4)DELE命令
命令格式:
DELE<邮件的序号>,该命令告诉服务器将邮件标记为删除
3.更新状态
当客户在操作状态下发送QUIT命令后,会话进入更新状态。
3.1、与邮件服务器的连接:
JavaMailAPI中定义了一个javax.mail.Store类,它用于执行邮件接收任务,这个类的实例对象封装了某种邮件接收协议的底层实施细节,应用程序调用这个类中的方法就可以获得用户邮箱中的各个邮件夹的信息。
JavaMail使用Folder对象表示邮件夹,通过Folder对象的方法应用程序进而又可以获得该邮件夹中的所有邮件信息,而每封邮件信息,JavaMail又分别使用了一个Message对象进行封装。
主要代码:
Propertiesprops=newProperties();
//存储接收邮件服务器使用的协议
props.setProperty("mail.store.protocol",“pop3”);
//设置接收邮件服务器的地址
props.setProperty("mail.pop3.host","");
//根据属性新建一个邮件会话
Sessionsession=Session.getInstance(props);
//从会话对象中获得POP3协议的Store对象
Storestore=session.getStore("pop3");
//如果需要查看接收邮件的详细信息,需要设置Debug标志
session.setDebug(false);
3.2、窗体的构建:
使用MVC结构的思想构建一个窗体,其中包括两个按钮一个用于控制显示邮件的各种信息,一个用于控制删除功能,一个文本框用来输入要删除的邮件序号以及一个文本域来显示各方面的信息。
主要代码:
Example.java:
publicclassExample{
publicstaticvoidmain(Stringargs[]){
WindowTrianglewin=newWindowTriangle();
win.setTitle("邮件接收和删除程序");
win.setBounds(100,100,420,260);
}
}
WindowTriangle.java:
publicclassWindowTriangleextendsJFrameimplementsActionListener{
ReciveOneMailpmm;//模型
JTextFieldtextA;//视图
JTextAreashowArea;//视图
JButtoncontrolButton1,controlButton2;//控制器
WindowTriangle(){
init();
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
voidinit(){
textA=newJTextField(5);
showArea=newJTextArea();
controlButton1=newJButton("显示邮件");
controlButton2=newJButton("确认");
JPanelpNorth=newJPanel();
pNorth.add(controlButton1);
pNorth.add(newJLabel("需删除的序号:
"));
pNorth.add(textA);
pNorth.add(controlButton2);
controlButton1.addActionListener(this);
controlButton2.addActionListener(this);
//controlButton.addActionListener(newActionListener(){所有ActionListener的函数定义...})
add(pNorth,BorderLayout.NORTH);
add(newJScrollPane(showArea),BorderLayout.CENTER);
}
......
3.3、查看邮件信息方法以及删除功能的实现:
创建一个ReciveOneMail的java类,在其中实现查看邮件的属性、标题和内容等的方法,然后在WindowTriangle的java类中创建模型,最后可以直接用这样一个对象调用这些方法。
删除功能主要是运用Flags的对象,来设置邮件的标志,当为Flags.Flag.DELETED时,此时邮件将被删除。
主要代码:
WindowTriangle.Java:
......
publicvoidactionPerformed(ActionEvente){
try{
Stringhost="";
StringuserName="zhuhong19930722@";
StringpassWord="zhuhong1993";
Propertiesprops=newProperties();
Sessionsession=Session.getDefaultInstance(props);
session.setDebug(true);
Storestore=session.getStore("pop3");
store.connect(host,userName,passWord);//验证
Folderfolder=store.getFolder("INBOX");//取得收件文件夹
folder.open(Folder.READ_WRITE);
if(e.getSource()==controlButton1){
showArea.append("receive..............................."+"\n");
Messagemsg[]=folder.getMessages();
showArea.append("邮件个数:
"+msg.length+"\n");
ReciveOneMailpmm=null;
for(inti=0;iMessagemessage=msg[i];
Addressaddress[]=message.getFrom();
showArea.append("======================");
pmm=newReciveOneMail((MimeMessage)msg[i]);
showArea.append("Message"+i+"主题:
"+pmm.getSubject()+"\n"+
"Message"+i+"是否回复:
"+pmm.getReplySign()+"\n"+
"Message"+i+"是否已读:
"+pmm.isNew()+"\n"+
"Message"+i+"form:
"+pmm.getFrom()+"\n"+
"Message"+i+"to:
"+pmm.getMailAddress("to")+"\n");
pmm.setDateFormat("yy年MM月dd日HH:
mm");
showArea.append("Message"+i+"发送日期:
"+pmm.getSentDate()+"\n");
//获得邮件内容===============
pmm.getMailContent((Part)msg[i]);
showArea.append("Message"+i+"正文:
\r\n"
+pmm.getBodyText()+"\n");
pmm.saveAttachMent((Part)msg[i]);
showArea.append("\n");}
intcountOfAll=folder.getMessageCount();//取得邮件个数
intunReadCount=folder.getUnreadMessageCount();//已读个数
intnewOfCount=folder.getNewMessageCount();//未读个数
showArea.append("总个数:
"+countOfAll+"\n"+
"已读个数:
"+unReadCount+"\n"+
"未读个数:
"+newOfCount+"\n");
JOptionPane.showMessageDialog(this,"若想删除某邮件,请输入你要删除第几份邮件的序号","消息对话框",
JOptionPane.WARNING_MESSAGE);
}elseif(e.getSource()==controlButton2){
showArea.append("delete..............................."+"\n");
intcountOfAll=folder.getMessageCount();//取得邮件个数
inti=(int)Double.parseDouble(textA.getText().trim());
if(i>countOfAll||i<0){
JOptionPane.showMessageDialog(this,"你输入有误!
","消息对话框",
JOptionPane.WARNING_MESSAGE);
}else{
Messagemessage=folder.getMessage(i);
message.setFlag(Flags.Flag.DELETED,true);//设置已删除状态为true
if(message.isSet(Flags.Flag.DELETED)){
showArea.append("已经删除第"+i+"邮件。
。
。
。
。
。
。
。
。
");
JOptionPane.showMessageDialog(this,"删除成功","消息对话框",
JOptionPane.WARNING_MESSAGE);
}
}
folder.close(true);
store.close();
}
}catch(Exceptionex){
showArea.append("\n"+ex+"\n");
}
}
4.结果及分析
(1)运行程序,会显示整个窗体,如图:
(2)点击显示邮件,与服务器连接,如图:
(3)显示所有文件:
(4)假如你要删除某个邮件,要输入准确的序号,若输入的序号不符合要求,会跳出提示对话框“你输入有误”,反之则成功删除,并跳出提示对话框“删除成功”,如图:
5.设计小结
平常自己会用到邮件,不过基本上不会深究sina,网易,outlook那些软件到底是怎样发送和取得E-mail的,只要会用就行。
不过通过本次课程设计,接触到其低层次,深刻了解了实现原理,当然不只是熟悉对信元信头等字段的规定,还了解了POP3协议提供的命令及如何具体实现客户端和服务器的链接。
总之,本课程设计实现了实验要求,也能实现抄送、暗送等功能,虽然没有专业邮箱那么高端,不过作为客户端口,还算有自己完整的一套系统和相对友好的界面,在浏览器下运行时也不差。
6.参考文献
[1]马骏等著.C#网络应用编程,2010.北京:
人民邮电出版社.
[2]邓亚平著.计算机网络[M],1999.北京:
北京邮电出版社.