




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
用SMTP实现EMAIL客户端训练目的运用各种编程语言实现基于smtp协议的Email客户端软件。通过本实验,能够对网络编程有进一步的理解和掌握,并能够理解smtp协议的细节。SMTP实现EMAIL客户端功能程序设计SMTP客户机(运行在发送邮件服务器上)在25号端口建立一个到SMTP服务器(运行在接收邮件服务器上)的TCP连接。客户机和服务器执行一些应用层的握手。SMTP客户机指明发送方的邮件地址和接收方的邮件地址。客户机发送报文,SMTP利用TCP提供的可靠数据传输无差错地将邮件投递打牌接收服务器。客户机如果有另外的报文要发送到该服务器,就在该相同的TCP链接上重复这种处理,否则,它指示TCP关闭连接。测试结果与分析使用eclipse执行编写好的SMTP实现EMAIL客户端功能程序,显示如下界面:在界面中填写好信息,点击send按钮,进行邮件发送。邮件发送完成,下面的JtextArea框中显示出发送过程的SMTP客户机和SMTP服务器之间交换的报文脚本。打开邮箱,查看到该邮件已经成功的发送到接收方邮箱之中。SMTP客户机和SMTP服务器之间交换的报文脚本C: heloS: 250OKC: AUTHLOGINS: 334dXNlcm5hbWU6C: MTMyODEwNjlAYmp0dS5lZHUuY24=S: 334UGFzc3dvcmQ6C: MTMyNDM1S: 235AuthenticationsuccessfulC: MAILFROM:<13281069@>S: 250MailOKC: RCPTTO:<519399762@>S: 250MailOKC: DATAS: 354Enddatawith<CR><LF>.<CR><LF>C: Subject:用SMTP实现EMAIL客户端实验C: From:""<13281069@>C: To:""<519399762@>C: C: 测试文本内容:用SMTP实现EMAIL客户端实验C: .S: 250MailOKqueuedasMp5wygBHKAUiDj9WHvDBAA--.16623S2C: QUITS: 221Bye分析:从上面客户机与服务器交换报文脚本信息中可以看出,客户机程序从邮件服务器向邮件服务器发送了一个报文,报文的首部为:Subject:用SMTP实现EMAIL客户端实验From:""<13281069@>To:""<519399762@>在报文首部之后,紧接着是一个空白行,然后是报文的主体。该客户机发送的命令:HELO(是HELLO的缩写)、MAILFROM、RCPTTO、DATA以及QUIT完成了客户机与服务器的握手、指明发送方和接收方的邮件地址、告诉服务器将要传送邮件内容以及结束等。客户机通过发送一个包含一个句点的行,告诉服务器该报文结束了。(按照ASCII码的表示方法,每个报文以CRLF.CRLF结束,其中的CR和LF分别表示回车和换行。)服务器对每条指令做出回答,其中每个回答含有一个回答码和一些英文解释。实验总结通过本实验,我对网络编程有进一步的理解和掌握,并能够理解smtp协议的细节。通过实验中程序运行输出的SMTP客户机与SMTP服务器之间报文脚本的交换,我可以更清楚的看到在整个邮件发送的过程中服务器和客户机之间是怎么进行信息交换的,同时我还了解了邮件的报文格式,对报文的首部和报文的主体部分有了更加深刻的了解。SMTP实现EMAIL客户端功能程序代码User.java文件:packagemailClient;publicclassUser{ privateStringbase64Name=""; privateStringbase64Pass="";//用于用户登陆 publicvoidsetNameAndPass(Stringname,Stringpass){ this.base64Name=name; this.base64Pass=pass; } publicStringgetBase64Name(){ returnbase64Name; } publicStringgetBase64Pass(){ returnbase64Pass; }}SendMail.java文件:packagemailClient;importjava.awt.BorderLayout;importjava.awt.GridLayout;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.io.IOException;importjava.io.PrintWriter;import.InetAddress;import.Socket;importjava.util.Scanner;importmons.codec.binary.Base64;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JOptionPane;importjavax.swing.JPanel;importjavax.swing.JPasswordField;importjavax.swing.JScrollPane;importjavax.swing.JTextArea;importjavax.swing.JTextField;importsun.misc.*;publicclassSendMailextendsJFrame{ privatestaticfinallongserialVersionUID=1L; privateinttestNum=0; //测试18k的文件经过加密后循环次数 privateJTextFieldfrom; privateJTextFieldto; privateJTextFieldsubject; privateJTextFieldserver; privateJTextAreamessage; privateJTextAreacomm; privateScannerin; privatePrintWriterout; privateJTextFielduserName; privateJPasswordFielduserPass; privateStringcurrReponse=""; //辅助性显示当前从服务器传回来的指令 privateUseruser=newUser(); publicSendMail(){ //设置frame setSize(600,400); setTitle("MySMTPClient"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setLocationRelativeTo(null); //addtoframe JPanelp1=newJPanel(newGridLayout(3,4)); p1.add(newJLabel("from:")); from=newJTextField(20); p1.add(from); p1.add(newJLabel("userPass:")); userName=from; userPass=newJPasswordField(20); Stringname=userName.getText().toString().trim(); Stringpass=newString(userPass.getPassword()); if(name!=null&&pass!=null&&!name.equalsIgnoreCase("")&&!pass.equalsIgnoreCase("")){ name=newString(Base64.encodeBase64(name.getBytes())); pass=newString(Base64.encodeBase64(pass.getBytes())); user.setNameAndPass(name,pass); } p1.add(userPass); p1.add(newJLabel("to:")); to=newJTextField(20); p1.add(to); p1.add(newJLabel("SMTPserver:")); server=newJTextField(20); p1.add(server); subject=newJTextField(20); p1.add(newJLabel("Subject:")); p1.add(subject); add(p1,BorderLayout.NORTH); JPanelp2=newJPanel(newGridLayout(2,1)); message=newJTextArea(); p2.add(newJScrollPane(message)); comm=newJTextArea(); comm.setEditable(false); comm.setText("Waiting..."); p2.add(newJScrollPane(comm)); add(p2,BorderLayout.CENTER); JPanelp3=newJPanel(); JButtonsendButton=newJButton("send"); p3.add(sendButton); add(p3,BorderLayout.SOUTH); sendButton.addActionListener(newActionListener(){ @SuppressWarnings("deprecation") @Override publicvoidactionPerformed(ActionEvente){ comm.setText("");sendMail(server.getText().trim(),from.getText().trim(),to.getText().trim(),message.getText(),subject.getText(),userName.getText(),userPass.getText()); } }); setVisible(true); } @SuppressWarnings("restriction") privatevoidsendMail(Stringserver,Stringfrom,Stringto,Stringmessage,Stringsub,Stringuser_name,Stringkey){ try{ Sockets=newSocket(server,25); try{ in=newScanner(s.getInputStream()); out=newPrintWriter(s.getOutputStream()); StringhostName=InetAddress.getLocalHost().getHostAddress(); currReponse=in.nextLine(); if(currReponse.substring(0,3).compareToIgnoreCase("220")==0){ send("helo"+server); //握手,成功返回220表示服务就位,或者可以使用ehlo命令 receive(); } if(currReponse.substring(0,3).compareToIgnoreCase("250")==0){ send("AUTHLOGIN"); //发送登陆命令 receive(); BASE64Encodercoder=newBASE64Encoder(); send(coder.encode(user_name.getBytes())); receive(); send(coder.encode(key.getBytes())); receive(); } if(currReponse.substring(0,3).compareToIgnoreCase("334")==0){ send(user.getBase64Name(),false); //不显示用户名 receive(); }elseif(currReponse.substring(0,3).compareToIgnoreCase("535")==0){ JOptionPane.showMessageDialog(null,"请登录","alert",JOptionPane.ERROR_MESSAGE); return; } if(currReponse.substring(0,3).compareToIgnoreCase("334")==0){ send(user.getBase64Pass(),false); //不显示密码 receive(); }elseif(currReponse.substring(0,3).compareToIgnoreCase("535")==0){ JOptionPane.showMessageDialog(null,"请登录","alert",JOptionPane.ERROR_MESSAGE); return; } if(currReponse.substring(0,3).compareToIgnoreCase("235")==0){ send("MAILFROM:<"+from+">"); //发件人邮箱 receive(); } if(currReponse.substring(0,3).compareToIgnoreCase("250")==0){ send("RCPTTO:<"+to+">"); //收件人信箱 receive(); } if(currReponse.substring(0,3).compareToIgnoreCase("250")==0){ send("DATA"); //开始发送邮件内容 receive(); } if(currReponse.substring(0,3).compareToIgnoreCase("354")==0){ send("Subject:"+sub); send("From:\"\"<"+from+">"); //会显示在收件人邮箱中“发件人”那一栏 send("To:\"\"<"+to+">"); //会显示在收件人邮箱中“收件人”那一栏 //send("CC:抄送人<chaosong@>"); //抄送,\"\"的作用是将后面的用户名提取出来放到这里,省的写了 send(""); //换一行,区分标题和内容 send(message); //正式的内容 send("."); //最终以‘.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 IEC 62386-351:2025 EN Digital addressable lighting interface – Part 351: Particular requirements – Control devices – Luminaire-mounted control devices
- 重庆知识教育培训平台课件
- 重庆知识产权法培训课件
- 暑假培优练:静电场及其应用(学生版)-2025人教版新高二物理暑假专项提升
- 新解读《GB-T 3795-2014锰铁》深度解析
- 暑假复习:恒定电流与闭合电路欧姆定律 -2025人教版新高二物理暑假专项提升
- 人教版八年级数学上册 第十四章《全等三角形》单元检测卷及答案
- 《西方经济学》课程简介与教学大纲
- 老年人牙医知识培训课件
- 老年人春季养生知识课件
- (正式版)QBT 8003-2024 化妆品用原料 水杨酸
- 【大数据“杀熟”的法律规制探究17000字(论文)】
- 麻醉不良事件上报流程
- 精准施肥技术的优化与创新
- 秋季驾驶员安全教育课件
- 拆除沥青路面基层施工方案
- 电机成品检验报告
- (115)-第一章毛泽东思想及其历史地位
- 病原微生物实验室生物安全管理体系的建立与运行
- 部编人教版四年级上册道德与法治全册教案
- 建筑给排水-外文文献翻译
评论
0/150
提交评论