电子邮件接收程序(3)

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.北京:北京邮电出版社.


相关内容

  • 电子邮件发送和接收程序的开发 精品
  • VC++程序设计报告 电子邮件发送和接收程序 的开发 班 级: B电子051 姓 名: 学 号: 指导老师: 日 期: 2007年7月 目 录 第一章 需求分析 ............................................. 2 1.1开发背景.............. ...

  • 保险柜密码锁的结构和工作原理
  • 文章由 天猫商城 友情提供 保险柜密码锁的结构和工作原理  多拨式 最简单的密码锁,常见於低安全设定的单车锁,使用多个拨圈.每个圈的中间有凹位.锁的中心的一条轴,上有数个凸出的齿,用来卡住拨圈.当拨圈转到正确的密码组合,锁便可以打开.这种锁是最容易打开的.很多这类锁根本无需知道密码都能开启.除非它 ...

  • 7电子邮件接收程序
  • 网络编程技术 课程设计报告 专业计算机科学与技术 信息工程学 院 题目:电子邮件接收程序 1.概述 随着因特网的普及,电子邮件已经成为人们日常工作.生活中必不可少的通信工具.客户端接收邮件时,POP3可以用来读取和保存接收到的邮件,允许客户端连接到服务器并下载所有的邮件到客户机上的邮箱. 这次课程设 ...

  • 电子邮件系统的设计与开发
  • 山东农业大学 毕业论文 题目: 二○○八年六月 中英文摘要 第一章 电子邮件的发展背景和意义 电子邮件翻译自英文的E-mail ,它表示通过电子通讯系统进行信件的书写.发送和接收. 30多年前,人们发明了电子邮件这种便捷的信息传递方式,这是人类通信历史上的一次革命. 电子邮件的兴起是在20世纪80年 ...

  • 电子邮件SMTP_POP3收发协议的研究与实现
  • 第28卷 第8期信 息 技 术VOL.28 NO.8 2004年8月INFORMATIONTECHNOLOGYAug.2004 电子邮件SMTP/POP3收发协议的研究与实现 付祝财1,杨莘元2,王 阳3 (1.黑龙江省通信传输局,哈尔滨150006;2.哈尔滨工程大学信息与通信工程学院,哈尔滨15 ...

  • 无线遥控LED电子显示屏
  • 第二+一届中国(天津)'2007lT.网络.信息技术.电子.仪器仪表创新学术会议 无线遥控L印电子显示屏 郭萌 (天津市中环系统工程有限责任公司项目三部300060022-23350446) 摘要:提出了通过无线遥控LED显示屏的新方案,讨论了高稳定性无线数字通信的系统方案,分析了图像点 阵抽取和移 ...

  • 重点红外线防盗报警器的设计_[主动式]
  • 对射式红外线防盗报警器的设计 摘 要 本系统是基于AT89S52单片机控制的红外线防盗报警器,主要由红外线发射部分.红外线接收部分.单片机以及声光报警部分组成.可通过发射电路发射的红外线被遮挡时控制报警系统报警, 通过单片机控制报警电路的运行,并能同时进行声光报警,用红外线收发管进行检测,安装隐蔽, ...

  • 测量学自学教程12
  • 第十二章 测量新仪器和新技术简介 一.本章重点 1.了解测量新仪器的构造特点和技术操纵方法. 2.了解测量新技术的应用情况. 二.本章难点 测量新仪器的设计思路与应用技术. 三.课时分配 本章讲授2-4学时. 第一节 电子水准仪 一.构造与工作原理 电子水准仪是一种自动化程度很高的智能水准仪器,如图 ...

  • 超声波测距仪软件设计
  • 摘 要 由于超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,被广泛的用于距离的测量,如测距仪和物位测量仪等都可以通过超声波来实现.利用超声波检测往往比较迅速.快捷.方便简单.易于做到实时控制.是一种非接触式的检测方式,与其他方法相比不受光线,被测对象颜色的影响,对于被物体处于黑暗.有灰尘.烟雾 ...