电子邮件接收程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
网络编程技术
课程设计报告
专
业 计算机科学与技术
信息工程学院
题目:电子邮件接收程序
1. 概述
随着因特网的普及,电子邮件已经成为人们日常工作、生活中必不可少的通信工具。
客户端接收邮件时,POP3可以用来读取和保存接收到的邮件,允许客户端连接到服务器并下载所有的邮件到客户机上的邮箱。
这次课程设计是用java语言实现了基于POP3的邮件接收程序,要求能通过POP3邮件服务器接收邮件并查看邮件的属性及标题和内容等,能删除邮件服务器中的邮件。
2. 设计原理
POP3邮件服务器通过侦听TCP端口110提供POP3服务。
客户端软件读取邮件之前,需要先与服务器建立TCP连接。
连接成功后,POP3服务器会向该客户端发送确认消息。
然后客户端根据服务器回送的信息决定下一步的操作。
在POP3协议中,规定的命令只有十几条。
每条命令均由命令和参数两部分组成,而且每条命令都以回车换行结束。
命令和参数之间空格隔开。
POP3命令包含一个大小写无关的关键字和一个或多个参量,所有的命令以<CR><LF>(回车换行符)作为其结束标志。
关键字和参量必须是非控制符的ASCII码字符。
关键字和参量之间,参量和参量之间由一个空格字符分隔开。
命令部分由3至4个字母组成,参数部分最多可达40个字符长度。
POP3服务器回送的响应信息由一个状态码和一个可能跟有附加消息的字符串组成。
状态码有两种:“确定”和“失败”。
客户端每次向POP3服务器发送命令后,都要等待服务器响应,并处理接受的信息,然后再接着发送下一个命令,如此反复多次,一直持续到断开连接。
这个过程经历了3个状态:授权(AUTHORIZATION)状态、操作(TRANSACTION)状态和更新(UPDATE)状态。
POP3交互过程中的状态转换如图1所示:
图1 POP3的状态转换示意图
POP3交互模型基本原理为:POP3接收者对POP3发送者进行初始化连接,发送者对接收者发送询问指令“READY”,接收者则向发送者提交所要接收数据的要求,发送者做出回应,并发送数据。
接收者则开始接收数据。
发送者发送完数据后,提出断开请求,并断开连接。
数据接收过程完成。
POP3交互模型如图2所
示:
图2 POP3交互模型
3. 详细设计及编码
3.1过程中的三个状态 1.授权状态
客户端首先与POP3服务器建立TCP 连接,服务器接收后发送一个单行的确认信息。
假设用C 表示客户端(Client ),S 表示服务器端(Server ),下面是客户端接收邮件前需要与服务器传输的信息。
(1)发送用户名
命令格式:USER<用户名>
该命令将客户的用户名发送到服务器,服务器返回“OK ”表示正确的用户名,“-ERR ”表示错误的用户名。
(2)用户名确认成功后,需要输入密码
命令格式:PASS<密码>
该命令将客户的密码发送给服务器。
服务器返回“OK ”表示正确的密码,“-ERR ”表示错误的密码。
2.操作状态
客户端将服务器成功确认了自己的身份后,POP3会话将进入操作状态,然后客户端就可以执行POP3命令进行相应的操作。
(1)STAT 命令
POP3发送者
R E A D Y “Hello ”
“Mail from ” “Rcpt to ” “Data ”(reque st to get)
O K
接 收 数据
Q U I T
断 开 连 接
POP3接收者 初始化连接
命令格式:STAT
该命令从服务器中获取邮件总数和总字节数,服务器响应命令返回邮件总数和总字节数。
(2)LIST命令
命令格式:LIST
该命令从服务器中获得邮件列表和大小。
服务器响应命令返回邮件列表和大小。
(3)RETR命令
命令格式:RETR命令
该命令从服务器中获得一个邮件
(4)DELE命令
命令格式:DELE<邮件的序号>
该命令告诉服务器将邮件标记为删除
3.更新状态
当客户在操作状态下发送QUIT命令后,会话进入更新状态。
QUIT命令
命令格式:QUIT
该命令关闭与服务器的连接。
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 = "";
String userName = "gotogop@";
String passWord = "123ling";
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 < msg.length; 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 < 0) {
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协议的邮件接收的过程以及客户端与邮件服务端连接的过程,以前在上课的时候,总是心不在焉,只是大概听听。
但是,这次课程设计让我有些悔恨,学习更加注重细节问题,应该好好听老师的每一句话。
其次,以前对于编程工具的使用已经有些淡化,但是经过这一段上机的实践,对于编程中的不断修改,怎么去排错、查错,怎么去看每一步的运行结果,怎么去了解每个类的内容以确保程序的正确性上都有了很大程度的提高。
通过这次课程设计发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
在设计中也遇到了很多编程问题,但最后经过自己的努力和大家的帮助完成了这次课程设计。
这让我明白了只要有恒心,有耐心,就可以达到自己的目标,完成任务!
最后,感谢帮助我完成课程设计的的老师和同学!
6. 参考文献
[1]邓亚平著.计算机网络[M],1999.北京:北京邮电出版社.
[2]马骏著.C#网络应用编程(第2版),2010.北京:人民邮电出版社.
[3]李博轩等著. Visual C++6.0 网络及 Internet开发指南[M],2000.北京:清华大学出版社.。