邮件发送接收课程设计报告.docx
《邮件发送接收课程设计报告.docx》由会员分享,可在线阅读,更多相关《邮件发送接收课程设计报告.docx(9页珍藏版)》请在冰豆网上搜索。
![邮件发送接收课程设计报告.docx](https://file1.bdocx.com/fileroot1/2023-1/25/164645f8-0831-4b3e-9c98-1ecc1224b8f1/164645f8-0831-4b3e-9c98-1ecc1224b8f11.gif)
邮件发送接收课程设计报告
邮件发送和接收
一、课程设计目的和要求2
1,要求:
2
2.课程设计主要内容2
二、设计思路3
三、分工4
四、具体程序和主要代码4
五、调试与最终运行结果10
六、个人总结11
一、课程设计目的和要求
本课程设计通过实现一个简单的邮件收发程序,从而使学生能够掌握利用Socket编程实现网络应用程序的基本方法。
1,要求:
[1]每组由同班2-4名同学组成,可以分组完成邮件发送和邮件接收两部分的内容,每人负责完成其中的一个部分或其中的若干项功能函数;
[2]每人都要提交课程设计报告,内容包括:
●整体设计方案及主程序流程和本人所属部分的主要内容;
●本人所完成功能函数的核心代码分析、子程序流程和主要代码;
●程序测试结果,包括测试采用的数据和结果。
[3]进行程序演示和验收
2.课程设计主要内容
编写程序,实现邮件发送和邮件接收。
(1)邮件发送
程序以命令行方式运行:
smtpsend,其中smtpsend为程序名。
在文件user.txt中,每行记录一个接收邮件的用户的Email地址以及用户的类型代码(用户类型为整数,Email地址和用户类型之间用空格分隔);在文件info.txt中记录用户类型代码及相应的邮件正文内容(类型代码和正文之间用空格分隔)。
程序运行时首先提示输入发送方的SMTP服务器地址,以及用户名和口令。
与服务器建立连接成功后,依次读取文件user.txt中接收方的Email地址,然后根据用户类型从文件中读取相应的正文内容,以电子邮件形式发送给用户。
(2)邮件接收
程序以命令行方式运行:
popreceive,其中popreceive为程序名。
程序运行时首先提示输入接收方的POP服务器地址,以及用户名和口令。
然后程序访问邮箱,从中读取新邮件的内容,并将发件人地址和邮件正文记录在文件rec_info.txt中。
二、设计思路
邮件接收端思路:
1,创建一个连接到POP3服务程序的套接字,使用户可以连接到邮件的服务器端。
同时用户可以自主的选择具体输入是哪个邮件服务器。
2,使用java中的socket进行网络编程,建立了连接后,用户可以通过使用pop服务器定义的指令来与服务器进行交互。
首先是user:
输入邮件的名称,然后是pass:
输入登录的密码。
成功登录邮箱后,就可以读取自己邮箱的中的邮件了。
Stat:
显示邮箱中所有的收到的邮件,并同时显示出它的大小。
List:
是分别显示每封邮件的大小。
Retr:
显示具体的一封邮件的所有信息。
Delete:
在pop服务器中删除掉所选的邮件,但是后来我发现,它并没有在自己的邮箱中删除,就是说还是可以在自己的邮箱里看到这封邮件。
3,因为要求要将所收到的邮件的内容写入到re_info.txt。
所以我编写了读写程序,对socket中服务器发送过来的每一行的内容进行的筛选,将邮件的发件人和邮件的内容写入到了E盘下的re_info.txt中。
三、分工
●唐琪玲负责邮件发送;
●朱涛负责邮件接收;
四、具体程序和主要代码
packagemail;
importjava.io.BufferedReader;
importjava.io.BufferedWriter;
importjava.io.FileWriter;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.InputStreamReader;
importjava.io.OutputStream;
importjava.io.PrintWriter;
import.Socket;
publicclasspopreceive{
privatestaticStringPOPServer="";//pop3服务器地址
privatestaticStrings="";
voidsetServer(Stringpopserver){
POPServer=popserver;
}//设置pop服务器的地址
publicstaticvoidmain(String[]args)throwsIOException{
Stringomd=null;
StringLINEFEED="\r\n";//回车换行字符
popreceivep=newpopreceive();
BufferedReaderstdin;
stdin=newBufferedReader(newInputStreamReader(System.in));
//创建一个BufferedReader对象来读取用户输入。
System.out.println("输入pop3服务器地址");
omd=stdin.readLine();
p.setServer(omd);
//上面就是根据输入的不同确定不同的服务器
//用户代理和服务器建立连接
intPOP3Port=110;
Socketsocket=null;//服务器端套接字
try{
//创建一个连接到POP3服务程序的套接字。
socket=newSocket(POPServer,POP3Port);
System.out.println("成功建立连接");
//创建一个BufferedReader对象,以便从套接字读取输出。
InputStreamis=socket.getInputStream();
BufferedReadersockin;
sockin=newBufferedReader(newInputStreamReader(is));//输入流
//创建一个PrintWriter对象,以便向套接字写入内容。
OutputStreamos=socket.getOutputStream();
PrintWritersockout;
sockout=newPrintWriter(os,true);//trueforauto-flush,自动刷新,输出流
//显示POP3握手信息。
//一旦连接,服务器就会向客户端发送信息?
System.out.println("S:
"+sockin.readLine());
System.out.println("随后输入用户名和密码及相应的命令"+LINEFEED);
while(true){
System.out.print("C:
");
//读取用户输入。
omd=stdin.readLine();
//将命令发送到POP3服务程序。
sockout.println(omd);
//读取POP3服务程序的回应消息。
StringreplyLine=sockin.readLine();
System.out.println("S:
"+replyLine);
//如果输入了RETR命令并且返回了成功的回应码,持续从套接字读取输出,
//直到遇到.。
这时从套接字读出的输出就是邮件的内容。
if(omd.toLowerCase().startsWith("list")
&&replyLine.charAt(0)=='+'){
do{
replyLine=sockin.readLine();
System.out.println("S:
"+replyLine);
if(replyLine!
=null&&replyLine.length()>0){
if(replyLine.charAt(0)=='.'){
break;
}
}
}while(true);
}
if(omd.toLowerCase().startsWith("retr")
&&replyLine.charAt(0)=='+'){
//toLowerCase(),返回一个字符串,把字符串中的字符转换成小写字母
do{
replyLine=sockin.readLine();
System.out.println("S:
"+replyLine);
//写程序,将邮件中的内容写入到re.info.txt中。
if(replyLine.startsWith("From:
")||(replyLine.contains("_")&&replyLine.contains("is"))){
s=replyLine;
System.out.println("写入成功");
FileWriterfr=newFileWriter("E:
\\rec_info.txt",true);
BufferedWriterbf=newBufferedWriter(fr);
bf.newLine();
bf.write(s);
bf.flush();
fr.close();
}
if(replyLine!
=null&&replyLine.length()>0)
if(replyLine.charAt(0)=='.')
break;
}while(true);
//如果用户输入了QUIT命令,退出邮件传输过程。
if(omd.toLowerCase().startsWith("quit")){
System.out.println("退出系统");
break;
}
}
}
}catch(IOExceptione){
System.out.println(e.toString());
}finally{
try{
if(socket!
=null)
socket.close();
}catch(IOExceptione){
}
}
}
}
五、调试与最终运行结果
分别接收两个邮箱的收件内容,以及它们的发送者。
并将其写入到rec_info.txt中
邮箱:
net_user01@
这个是执行的全部过程,包括从与服务器的连接,和登录的输入用户名和密码,和服务器返回来的内容This_is_about_Information_System
这是写文件,re_info.txt。
将邮箱:
net_user01@收到的邮件的内容写到这个txt中。
这个是运行后的结果。
邮箱:
net_user02@
上面的截图是打开第一封邮件执行的指令是retr1
上面的截图是打开第二封邮件执行的指令是retr2,此截图和上面的截图是同一个窗口,为了显示方便才分成了2个截图。
这是写程序。
re_info.txt。
将邮箱:
net_user02@收到的邮件的内容写到这个txt中。
六、个人总结
这次的课程设计,我和在假期中选择了邮件收发,一方面因为我们对这个问题比较感兴趣,还有就是在这个课题上老师给的参考资料也多,所以我们就做了这个邮件收发这个题目。
在上学期里我们刚好学了java这个课程,了解了socket的基本用法,理解邮件收发这个问题上并没又出现很多的困难。
我做的是邮件的接收这方面的,老师给了一个参考的代码,当我把代码放到eclipse中执行时,发现了很多的问题,包括word中的代码转到eclipse中出现的问题,还有一个很重要的问题就是,在与服务器连接上了以后,执行retr指令的时候,pop服务器并没有发送邮件中的内容,就是说看不到邮件中的内容,后来就一直都卡在这里,有好多天找不到原因,后来才发现是代码中缺少了list指令,输入retr后,执行的是list指令,原因在于list指令要先于retr编写,后来又加上了retr中的代码,最终成功了,可以看到接收邮件的内容。
在课程设计中第二个困难点在如何将邮件接收到的内容写入re_info.txt中。
由于java功底的薄弱,该开始我并没有理解这个读写程序怎么实现,后来通过网络上的视频教程,我才明白了文件流的相关问题。
最终我遍历了服务器发送过来的每一行的内容,根据筛选条件,成功将其写入了re_info.txt中。
整个过程从查找资料、可行性研究、总体设计、开发到完成优化,我认真完成自己的各项任务,从理论到实践都学到了很多东西,感想和认识也比较深刻。
在这次课程设计中,团队的分工和合作也很重要,虽然我们是两个人,但是我们也进行了详细的分工。