C#网络应用编程
课程设计报告
专业 计算机科学与技术
王世玮
B计算机112
1110704219
胡波
2013年7月5日 学生姓名 班学级 号 指导教师 完成日期
题目:邮件接收程序实现
1. 概述
POP3(Post Office Protocol Version 3),即邮局办公协议,该协议用于接收邮件的双方( 客户机、POP3服务器)进行通信。使用该协议,用户可以脱机阅读信件,而不必把客户机长期连接到网络上,以减少网络费用。POP3协议允许用户以一定的方式从保存邮件的服务器( 即POP3服务器)上取走自己的邮件。
本次程序设计是用java语言实现了基于POP3的邮件接收程序。其能通过POP3服务器接收邮件并能查看邮件的属性及标题和内容等,能删除邮件服务器中的邮件。
2. 设计原理
POP3提供了一种客户机/服务器脱机模型,客户机通过向服务器发送一些命令来完成相应的操作。客户机能够发送的命令与它所处的状态有关。协议中定义了三种状态:即确认状态(Authorization State)、处理状态(Transaction State)和更新状态(Update State)。在不同的状态下,客户机可以向服务器发送的命令是有区别的,某些命令还会导致状态的转换。POP3交互过程中的常用命令和状态转换如图3.2.1和表3.2.1所示。
图3.2.1 POP3的状态转换示意图
POP3服务器一般使用的是TCP的110号端口。当客户机与服务器建立TCP连接时,POP3服务器向客户机发回一个问候,交互过程即进入确认状态。此时,若客户机提供了自己的身份并成功确认,即由确认状态转入处理状态;在这个状态,用户可用相应的命令处理自己的邮件。在完成相应的处理过程后客户机发出QUIT命令,则进入更新状态;在此状态下,POP3服务器释放邮件资源并返回一个告别响应;最后关闭TCP连接。
3. 详细设计及编码
3.1、与邮件服务器的连接: JavaMail API中定义了一个javax.mail.Store类,它用于执行邮件接收任务,这个类的实例对象封装了某种邮件接收协议的底层实施细节,应用程序调用这个类中的方法就可以获得用户邮箱中的各个邮件夹的信息。JavaMail使用Folder对象表示邮件夹,通过Folder对象的方法应用程序进而又可以获得该邮件夹中的所有邮件信息,而每封邮件信息,JavaMail又分别使用了一个Message对象进行封装。
Store类:与Transport类一样,javax.mail.Store类也继承了
java.mail.Service类。Store类用于连接邮件接收服务器,并访问邮件接收服务器上的邮箱夹。Store类是一个抽象类,Sun公司在mail.jar包的
com/sun/mail/pop3目录中提供了POP3协议的实现子类POP3Store,POP3Store封装了POP3协议的底层实施细节。应用程序通常调用Session.getStore方法得到Store类的实例对象,这个方法根据Session对象中定义的
mail.store.procotol属性构建相应的协议实现类,并返回该类的实例对象。 主要代码:
Properties props = new Properties();
//存储接收邮件服务器使用的协议
props.setProperty("mail.store.protocol", “pop3”);
//设置接收邮件服务器的地址
props.setProperty("mail.pop3.host", "pop3.163.com");
//根据属性新建一个邮件会话
Session session=Session.getInstance(props);
//从会话对象中获得POP3协议的Store对象
Store store = session.getStore("pop3");
//如果需要查看接收邮件的详细信息,需要设置Debug标志
session.setDebug(false);
3.2、窗体的构建:
使用MVC结构的思想构建一个窗体,其中包括两个按钮一个用于控制显示邮件的各种信息,一个用于控制删除功能,一个文本框用来输入要删除的邮件序号以及一个文本域来显示各方面的信息。
主要代码:
Example.java:
public class Example {
public static void main(String args[]){
WindowTriangle win=new WindowTriangle();
win.setTitle("邮件接收和删除程序");
win.setBounds(100,100,420,260);
}
}
WindowTriangle.java:
public class WindowTriangle extends JFrame implements ActionListener {
ReciveOneMail pmm;//模型
JTextField textA; //视图
JTextArea showArea;//视图
JButton controlButton1, controlButton2;//控制器
WindowTriangle() {
init();
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
void init() {
textA = new JTextField(5);
showArea = new JTextArea();
controlButton1 = new JButton("显示邮件");
controlButton2 = new JButton("确认");
JPanel pNorth = new JPanel();
pNorth.add(controlButton1);
pNorth.add(new JLabel("需删除的序号:"));
pNorth.add(textA);
pNorth.add(controlButton2);
controlButton1.addActionListener(this);
controlButton2.addActionListener(this);
//controlButton.addActionListener(new ActionListener() { 所有ActionListener的函数定义...})
add(pNorth, BorderLayout.NORTH);
add(new JScrollPane(showArea), BorderLayout.CENTER);
}
......
3.3、查看邮件信息方法以及删除功能的实现:
创建一个ReciveOneMail的java类,在其中实现查看邮件的属性、标题和内容等的方法,然后在WindowTriangle的java类中创建模型,最后可以直接用这样一个对象调用这些方法。
删除功能主要是运用Flags的对象,来设置邮件的标志,当为
Flags.Flag.DELETED时,此时邮件将被删除。
主要代码:
WindowTriangle.Java:
......
public void actionPerformed(ActionEvent e) {
try {
String host = "pop3.163.com";
String userName = "[1**********]@163.com";
String passWord = "85575712wsw";
Properties props = new Properties();
Session session = Session.getDefaultInstance(props); session.setDebug(true);
Store store = session.getStore("pop3");
store.connect(host, userName, passWord);//验证
Folder folder = store.getFolder("INBOX");//取得收件文件夹 folder.open(Folder.READ_WRITE);
if (e.getSource() == controlButton1) {
showArea.append("receive..............................."+"\n"); Message msg[] = folder.getMessages();
showArea.append("邮件个数:" + msg.length+"\n"); ReciveOneMail pmm = null;
for (int i = 0; i
Message message = msg[i];
Address address[] = message.getFrom();
showArea.append("======================");
pmm = new ReciveOneMail((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");}
int countOfAll = folder.getMessageCount();//取得邮件个数 int unReadCount = folder.getUnreadMessageCount();//已读个数 int newOfCount = folder.getNewMessageCount();//未读个数
showArea.append("总个数:" + countOfAll + "\n" + "已读个数:" + unReadCount + "\n" + "未读个数:" + newOfCount + "\n");
JOptionPane.showMessageDialog(this, "若想删除某邮件,请输入你要删除第几份邮件的序号", "消息对话框",
JOptionPane.WARNING_MESSAGE);
} else if (e.getSource() == controlButton2) {
showArea.append("delete..............................."+ "\n"); int countOfAll = folder.getMessageCount();//取得邮件个数 int i = (int)
Double.parseDouble(textA.getText().trim());
if (i > countOfAll || i
JOptionPane.showMessageDialog(this, "你输入有误!", "消息对话框",
JOptionPane.WARNING_MESSAGE);
} else {
Message message = 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 (Exception ex) {
showArea.append("\n" + ex + "\n");
}
}
4. 结果及分析
第一步,运行程序,会显示整个窗体,如图:
第二步,点击显示邮件,与服务器连接,会显示邮件的标题、发送时间、发件人、
收件人和正文等信息,并会跳出一个提示对话框“若想删除某邮件,请输入你要删除第几份邮件的序号”,如图:
第三步,假如你要删除某个邮件,要输入准确的序号,若输入的序号不符合要求,会跳出提示对话框“你输入有误”,反之则成功删除,并跳出提示对话框“删除成功”,如图:
5. 设计小结
通过本次对邮件接收程序的课程设计,让我了解了基于POP3协议的邮件接收的过程以及客户端与邮件服务端连接的过程,让我加深了对java编程的理解,让我进一步熟悉对MVC结构的使用。虽然其中也出现了些问题,比如设计初没有接触尝试过对相似系统的设计、设计时编写程式不是很顺利、调试程序是出现很多错误、软件界面过于简洁等问题。但是找来相关资料,经过一番研究,对该系统有了较清晰的认识,才开始着手于正式设计,经过一段时间的研究,找到了可行的函数模式,不断地耐心调试,直至出现满意的结果,经过相应的修改,终于达到了较好的效果。总之这次课程设计让我收获很多。
6. 参考文献
[1] 耿祥义,张跃平编著.java2实用教程(第4版):清华大学出版社.
[2]邓亚平 著.计算机网络[M],1999.北京:北京邮电出版社.
C#网络应用编程
课程设计报告
专业 计算机科学与技术
王世玮
B计算机112
1110704219
胡波
2013年7月5日 学生姓名 班学级 号 指导教师 完成日期
题目:邮件接收程序实现
1. 概述
POP3(Post Office Protocol Version 3),即邮局办公协议,该协议用于接收邮件的双方( 客户机、POP3服务器)进行通信。使用该协议,用户可以脱机阅读信件,而不必把客户机长期连接到网络上,以减少网络费用。POP3协议允许用户以一定的方式从保存邮件的服务器( 即POP3服务器)上取走自己的邮件。
本次程序设计是用java语言实现了基于POP3的邮件接收程序。其能通过POP3服务器接收邮件并能查看邮件的属性及标题和内容等,能删除邮件服务器中的邮件。
2. 设计原理
POP3提供了一种客户机/服务器脱机模型,客户机通过向服务器发送一些命令来完成相应的操作。客户机能够发送的命令与它所处的状态有关。协议中定义了三种状态:即确认状态(Authorization State)、处理状态(Transaction State)和更新状态(Update State)。在不同的状态下,客户机可以向服务器发送的命令是有区别的,某些命令还会导致状态的转换。POP3交互过程中的常用命令和状态转换如图3.2.1和表3.2.1所示。
图3.2.1 POP3的状态转换示意图
POP3服务器一般使用的是TCP的110号端口。当客户机与服务器建立TCP连接时,POP3服务器向客户机发回一个问候,交互过程即进入确认状态。此时,若客户机提供了自己的身份并成功确认,即由确认状态转入处理状态;在这个状态,用户可用相应的命令处理自己的邮件。在完成相应的处理过程后客户机发出QUIT命令,则进入更新状态;在此状态下,POP3服务器释放邮件资源并返回一个告别响应;最后关闭TCP连接。
3. 详细设计及编码
3.1、与邮件服务器的连接: JavaMail API中定义了一个javax.mail.Store类,它用于执行邮件接收任务,这个类的实例对象封装了某种邮件接收协议的底层实施细节,应用程序调用这个类中的方法就可以获得用户邮箱中的各个邮件夹的信息。JavaMail使用Folder对象表示邮件夹,通过Folder对象的方法应用程序进而又可以获得该邮件夹中的所有邮件信息,而每封邮件信息,JavaMail又分别使用了一个Message对象进行封装。
Store类:与Transport类一样,javax.mail.Store类也继承了
java.mail.Service类。Store类用于连接邮件接收服务器,并访问邮件接收服务器上的邮箱夹。Store类是一个抽象类,Sun公司在mail.jar包的
com/sun/mail/pop3目录中提供了POP3协议的实现子类POP3Store,POP3Store封装了POP3协议的底层实施细节。应用程序通常调用Session.getStore方法得到Store类的实例对象,这个方法根据Session对象中定义的
mail.store.procotol属性构建相应的协议实现类,并返回该类的实例对象。 主要代码:
Properties props = new Properties();
//存储接收邮件服务器使用的协议
props.setProperty("mail.store.protocol", “pop3”);
//设置接收邮件服务器的地址
props.setProperty("mail.pop3.host", "pop3.163.com");
//根据属性新建一个邮件会话
Session session=Session.getInstance(props);
//从会话对象中获得POP3协议的Store对象
Store store = session.getStore("pop3");
//如果需要查看接收邮件的详细信息,需要设置Debug标志
session.setDebug(false);
3.2、窗体的构建:
使用MVC结构的思想构建一个窗体,其中包括两个按钮一个用于控制显示邮件的各种信息,一个用于控制删除功能,一个文本框用来输入要删除的邮件序号以及一个文本域来显示各方面的信息。
主要代码:
Example.java:
public class Example {
public static void main(String args[]){
WindowTriangle win=new WindowTriangle();
win.setTitle("邮件接收和删除程序");
win.setBounds(100,100,420,260);
}
}
WindowTriangle.java:
public class WindowTriangle extends JFrame implements ActionListener {
ReciveOneMail pmm;//模型
JTextField textA; //视图
JTextArea showArea;//视图
JButton controlButton1, controlButton2;//控制器
WindowTriangle() {
init();
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
void init() {
textA = new JTextField(5);
showArea = new JTextArea();
controlButton1 = new JButton("显示邮件");
controlButton2 = new JButton("确认");
JPanel pNorth = new JPanel();
pNorth.add(controlButton1);
pNorth.add(new JLabel("需删除的序号:"));
pNorth.add(textA);
pNorth.add(controlButton2);
controlButton1.addActionListener(this);
controlButton2.addActionListener(this);
//controlButton.addActionListener(new ActionListener() { 所有ActionListener的函数定义...})
add(pNorth, BorderLayout.NORTH);
add(new JScrollPane(showArea), BorderLayout.CENTER);
}
......
3.3、查看邮件信息方法以及删除功能的实现:
创建一个ReciveOneMail的java类,在其中实现查看邮件的属性、标题和内容等的方法,然后在WindowTriangle的java类中创建模型,最后可以直接用这样一个对象调用这些方法。
删除功能主要是运用Flags的对象,来设置邮件的标志,当为
Flags.Flag.DELETED时,此时邮件将被删除。
主要代码:
WindowTriangle.Java:
......
public void actionPerformed(ActionEvent e) {
try {
String host = "pop3.163.com";
String userName = "[1**********]@163.com";
String passWord = "85575712wsw";
Properties props = new Properties();
Session session = Session.getDefaultInstance(props); session.setDebug(true);
Store store = session.getStore("pop3");
store.connect(host, userName, passWord);//验证
Folder folder = store.getFolder("INBOX");//取得收件文件夹 folder.open(Folder.READ_WRITE);
if (e.getSource() == controlButton1) {
showArea.append("receive..............................."+"\n"); Message msg[] = folder.getMessages();
showArea.append("邮件个数:" + msg.length+"\n"); ReciveOneMail pmm = null;
for (int i = 0; i
Message message = msg[i];
Address address[] = message.getFrom();
showArea.append("======================");
pmm = new ReciveOneMail((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");}
int countOfAll = folder.getMessageCount();//取得邮件个数 int unReadCount = folder.getUnreadMessageCount();//已读个数 int newOfCount = folder.getNewMessageCount();//未读个数
showArea.append("总个数:" + countOfAll + "\n" + "已读个数:" + unReadCount + "\n" + "未读个数:" + newOfCount + "\n");
JOptionPane.showMessageDialog(this, "若想删除某邮件,请输入你要删除第几份邮件的序号", "消息对话框",
JOptionPane.WARNING_MESSAGE);
} else if (e.getSource() == controlButton2) {
showArea.append("delete..............................."+ "\n"); int countOfAll = folder.getMessageCount();//取得邮件个数 int i = (int)
Double.parseDouble(textA.getText().trim());
if (i > countOfAll || i
JOptionPane.showMessageDialog(this, "你输入有误!", "消息对话框",
JOptionPane.WARNING_MESSAGE);
} else {
Message message = 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 (Exception ex) {
showArea.append("\n" + ex + "\n");
}
}
4. 结果及分析
第一步,运行程序,会显示整个窗体,如图:
第二步,点击显示邮件,与服务器连接,会显示邮件的标题、发送时间、发件人、
收件人和正文等信息,并会跳出一个提示对话框“若想删除某邮件,请输入你要删除第几份邮件的序号”,如图:
第三步,假如你要删除某个邮件,要输入准确的序号,若输入的序号不符合要求,会跳出提示对话框“你输入有误”,反之则成功删除,并跳出提示对话框“删除成功”,如图:
5. 设计小结
通过本次对邮件接收程序的课程设计,让我了解了基于POP3协议的邮件接收的过程以及客户端与邮件服务端连接的过程,让我加深了对java编程的理解,让我进一步熟悉对MVC结构的使用。虽然其中也出现了些问题,比如设计初没有接触尝试过对相似系统的设计、设计时编写程式不是很顺利、调试程序是出现很多错误、软件界面过于简洁等问题。但是找来相关资料,经过一番研究,对该系统有了较清晰的认识,才开始着手于正式设计,经过一段时间的研究,找到了可行的函数模式,不断地耐心调试,直至出现满意的结果,经过相应的修改,终于达到了较好的效果。总之这次课程设计让我收获很多。
6. 参考文献
[1] 耿祥义,张跃平编著.java2实用教程(第4版):清华大学出版社.
[2]邓亚平 著.计算机网络[M],1999.北京:北京邮电出版社.