用Java做邮件服务器_第1页
用Java做邮件服务器_第2页
用Java做邮件服务器_第3页
用Java做邮件服务器_第4页
用Java做邮件服务器_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

用Java做邮件服务器【摘要】Java是一种跨平台,适合于分布式计算环境的面向对象编程语言。具体来说,它具有如下特性:简单性、面向对象、分布式、解释型、可靠、安全、平台无关、可移植、高性能、多线程、动态性等。Java始于网络,服务于网络,用Java做的网络程序,随处可见,这里我就不多做介绍了,下面给大家介绍一种用Java实现的GUI界面的邮件收发系统。本文是一篇入门级教程,主要讲了1)利用Eclipse这个优秀的JavaIDE中创建应用程序界面;2〕利用J2EE的API构建自己的邮件收发系统。要求您对JavaMail和JavaBeans和GUI的一些相关知识。所用到的工具包括Eclipse〔是一个JAVAIDE〕、j2ee.jar〔里面包含了所用的关于mail的API〕、jigloo312.zip〔提供一个用户可定制GUI的JAVAAPI可到://cloudgarden/jigloo/index.html下载〕【简介】在介绍本文之前,需要先简介一下邮件服务的一些基本概念,以期更好的理解本文。在一个目前常用的邮件系统中,收发邮件功能的实现是通过不同的协议实现的,收邮件一般采用POP〔PostOfficeProtocol〕协议,即邮局协议,目前所用的版本是3,所以人们通常称之为POP3,。该协议定义了接收邮件的机制,并规定每个用户只能有一个邮箱的支持。占用端口一般为25;发邮件一般采用SMTP〔SimpleMailTransferProtocol〕协议,即简单邮件传输协议,它定义了发送电子邮件的机制,通过它程序将和您的公司或因特网服务供给商的〔InternetServiceProvider's,ISP's〕SMTP服务器通信。SMTP服务器可将消息中转至接收方SMTP服务器,以便最终让用户经由POP或IMAP获得。占用端口一般为110;通过程序实现这两个协议,我们就可以构建自己企业的邮件收发系统。【关键字】JavaMailJ2EEGUIEclipsePOPSMTP还在为没有一个统一,兼容于任何平台的邮件收发系统而着急吗?不用急,这篇文章可以给您敲开一扇开发适合自己企业业务环境的邮件收发系统的大门!一,开发准备从下载Eclipse,我所用的版本为,大家可以下3.0.2或更高;从://cloudgarden/jigloo/index.html下载jigloo312.zip压缩包,将解压后的plugins和features两个文件夹的内容分别拷贝到eclipse包含的plusins和features文件夹里。在本地新建一个文件夹〔如:d:\java\develop〕做为java开发的工作区,然后,在桌面新建一个eclipse.exe的快捷方式,右键点击“属性”,在“目标”栏里输入D:\eclipse\eclipse.exe-vm"G:\Java\jdk\bin\javaw.exe"-data"d:\java\develop",以后你在eclipse创建的程序都在d:\java\develop这个目录下了。如果还有其他项目的开发,可以在重新创建一个文件夹和eclipse.exe的快捷方式,重新指定工作区,相当于又做了一个全新的Eclipse环境。二,环境搭建A.1从桌面打开新建的eclipse快捷方式,新建一个java项目:输入项目名:javamail,然后Next->Finish。2,右键点击新建的“javamail”项目,选择“Properties”,选择“JavaBuildPath”,在“Library”里选择“AddExternalJARs”,将准备的j2ee.jar文件添加到里面,如图:好了,所有准备工作都做好了,下面开始开发。三,开始开发A,发送邮件A.1在javamail项目里新建一个Package名为“”,然后新建一个“Swingmainapplication”:“Next”->输入类名:SendMailGUI->“Finish”。A.2利用可拖拽的可视化面板绘制一个发送邮件的GUI界面〔界面功夫这里就不垒述了,后面有关界面的制作也都不作详细说明了,本文重点不在与此。有关GUI的知识请参见相关资料。〕:A.3邮件能够发送成功,关键在于这个“发送”按钮的动作的编写。A.5放着,备用。首先我们要做一个bean,取名为Mail,用来存储邮件的所有信息,之所以这样做,是为了将邮件的信息都封装到一个java类里,更容易管理,思路更明确,同时也是为了让读者比较容易明白这个功能应该怎样实现。在这个mailbean里我们设置了smtpServer、userName、password、from、to、subject、fileName、body以及popServer、popUser、popPassword几个变量,分别用来存储SMTP服务器地址、邮件的用户名、密码、从何而来要到哪去、邮件标题、附件的名字、正文以及POP服务器的地址、用户和其密码。在Eclipse里完成这个bean很简单:新建一个java类,定义上述变量〔StringsmtpServer,userName,password…〕,然后选中这些变量,击右键->Source->GenerateGettersandSetters…,Eclipse会自动生成这些变量的get/set方法。保存这个类,入正题,编写send的功能代码。A.6逐步讲解MailSender.java:i.定义SMTP服务器上的相关信息:StringsmtpServer=sendMail.getSmtpServer();Stringto=sendMail.getTo();Stringfrom=sendMail.getFrom();Stringsubject=sendMail.getSubject();Stringbody=sendMail.getBody();StringfileName=fileName=sendMail.getFileName();ii,定义一个Properties对象,并填充它:Propertiesprops=System.getProperties();props.setProperty("mail.smtp.host",smtpServer);props.setProperty("mail.smtp.port","25");props.put("mail.smtp.auth","true");props.setProperty("mail.smtp.user",username);iii,创建一个Authenticator的子类CheckAuthenticator,并向Session中注册:CheckAuthenticatorauth=newCheckAuthenticator();Sessionsession=Session.getDefaultInstance(props,auth);iv,创建一个Message:Messagemsg=newMimeMessage(session);iiv,创建邮件正题,里面的if(!fileName.equals(""))是做了一个是否包含附件的判断,如果没有,就只把正文做为Message的内容发送出去;如果有,就把附件和正文内容一并发送:try{BodyPartbp=newMimeBodyPart();Multipartmp=newMimeMultipart();bp.setText(body);//增加正文内容到bodypartmp.addBodyPart(bp);if(!fileName.equals("")){bp=newMimeBodyPart();FileDataSourcefileSource=newFileDataSource(fileName);bp.setDataHandler(newDataHandler(fileSource));bp.setFileName(fileSource.getName());mp.addBodyPart(bp);}msg.setContent(mp);}catch(Exceptione){System.err.println("增加邮件附件:"+fileName+"发生错误!"+e);}vii,发送Transport.send(msg);具体源代码〔MailSender.java〕如下:/**Createdon2005-5-19**TODOTochangethetemplateforthisgeneratedfilegoto*Window-Preferences-Java-CodeStyle-CodeTemplates*/packagecom.leeyoung.jmail.send;importjava.security.Security;importjava.util.Date;importjava.util.Properties;importjava.util.StringTokenizer;importjavax.activation.DataHandler;importjavax.activation.FileDataSource;importjavax.mail.BodyPart;importjavax.mail.Message;importjavax.mail.Multipart;importjavax.mail.Session;importjavax.mail.Transport;importernet.InternetAddress;importernet.MimeBodyPart;importernet.MimeMessage;importernet.MimeMultipart;importcom.leeyoung.jmail.bean.Mail;/***@authorCYY**TODOTochangethetemplateforthisgeneratedtypecommentgotoWindow-*Preferences-Java-CodeStyle-CodeTemplates*/publicclassMailSender{/***@paramsmtpServer*@paramto*@paramfrom*@paramsubject*@parambody*/publicvoidsend(MailsendMail){StringsmtpServer=sendMail.getSmtpServer();Stringto=sendMail.getTo();Stringfrom=sendMail.getFrom();Stringsubject=sendMail.getSubject();Stringbody=sendMail.getBody();StringfileName=fileName=sendMail.getFileName();try{Security.addProvider(newernal.ssl.Provider());//--GetaPropertiesobject--Propertiesprops=System.getProperties();props.setProperty("mail.smtp.host",smtpServer);props.setProperty("mail.smtp.port","25");props.put("mail.smtp.auth","true");StringTokenizerst=newStringTokenizer(from,"@");Stringusername=st.nextToken();props.setProperty("mail.smtp.user",username);CheckAuthenticatorauth=newCheckAuthenticator();Sessionsession=Session.getDefaultInstance(props,auth);//--Createanewmessage--Messagemsg=newMimeMessage(session);//--SettheFROMandTOfields--msg.setFrom(newInternetAddress(from));msg.setRecipients(Message.RecipientType.TO,InternetAddress.parse(to,false));msg.setSubject(subject);//下面不设邮件正文msg.setText(body),msg.setSentDate(newDate());//Judgethemailincludeaaffix,ifhave,sendit;ifnone,sendthemailbodyonly;System.out.println("开始增加邮件附件:"+fileName);try{BodyPartbp=newMimeBodyPart();Multipartmp=newMimeMultipart();bp.setText(body);//增加正文内容到bodypartmp.addBodyPart(bp);if(!fileName.equals("")){bp=newMimeBodyPart();FileDataSourcefileSource=newFileDataSource(fileName);bp.setDataHandler(newDataHandler(fileSource));bp.setFileName(fileSource.getName());mp.addBodyPart(bp);}msg.setContent(mp);}catch(Exceptione){System.err.println("增加邮件附件:"+fileName+"发生错误!"+e);}//--sendthemessage--Transport.send(msg);System.out.println("MessagesendOK.");}catch(Exceptionex){ex.printStackTrace();}}}A.7为了实现邮件的权限认证,我们需要做一个身份验证的模块CheckAuthenticator,这个类从Authenticator〔抽象类〕继承而来,要使用Authenticator,先创建该抽象类的子类,并从getPasswordAuthentication〔〕方法中返回PasswordAuthentication实例。创建完成后,必需向session注册该Authenticator。这样,在需要认证的时候,就会通知Authenticator。您可以通过JOptionPane来弹出窗口,这里使用Input对话框得到密码,具体应用中可以使用JPasswordField来实现〔这个不是本文重点,关于Swing的内容请参看相关资料〕。/**Createdon2005-5-18**TODOTochangethetemplateforthisgeneratedfilegoto*Window-Preferences-Java-CodeStyle-CodeTemplates*/packagecom.leeyoung.jmail.send;importjava.util.Properties;importjavax.mail.Authenticator;importjavax.mail.PasswordAuthentication;importjavax.mail.Session;importjavax.swing.JOptionPane;/***@authorCYY**TODOTochangethetemplateforthisgeneratedtypecommentgoto*Window-Preferences-Java-CodeStyle-CodeTemplates*/publicclassCheckAuthenticatorextendsAuthenticator{publicPasswordAuthenticationgetPasswordAuthentication(){StringuserName,password;Propertiesprops=System.getProperties();Sessionsession=Session.getInstance(props);userName=session.getProperty("mail.smtp.user");password=JOptionPane.showInputDialog("Enteryourpassword:");returnnewPasswordAuthentication(userName,password);}}A.8回到SendMailGUI.java中,给send这个按钮添加动作实现代码:privatevoidsendActionPerformed(ActionEventevt){/*addbychaoyang***Purpose:Thisisafuncationmodel.*/System.out.println("开始发送邮件......");MailsendMail=newMail();try{smtpServer_value=smtpAddress.getText();to_value=receiverField.getText();from_value=senderField.getText();subject_value=subjectField.getText();affixFileName_value=affixField.getText();body_value=bodyArea.getText();if(smtpServer_value!=null&&to_value!=null&&from_value!=null&&subject_value!=null&&body_value!=null){System.out.println(smtpServer_value+to_value+from_value+subject_value+body_value);sendMail.setSmtpServer(smtpServer_value);sendMail.setTo(to_value);sendMail.setFrom(from_value);sendMail.setSubject(subject_value);jLabel.setText("从"+from_value+"发往"+to_value+"注意输入密码...");if(affixFileName_value!=null){sendMail.setFileName(affixFileName_value);}sendMail.setBody(body_value);MailSendermailSender=newMailSender();mailSender.send(sendMail);jLabel.setText("发送成功!");}}catch(Exceptione){e.printStackTrace();}}A.9至此,这个GUI界面的邮件发送器完整做完了,它可以象在网易邮箱上发送邮件一样发送带附件的邮件。B,接收邮件“”,然后新建一个“Swingmainapplication”:“Next”->输入类名:ReceiveMailGUI->“Finish”。B.2同法炮制,利用可拖拽的可视化面板绘制一个接收邮件的GUI界面:B.3对按钮“接收”编写动作实现代码:privatevoidreceiveButtonActionPerformed(ActionEventevt){//reveiceyourmail:MailreceiveMail=newMail();//此处依然用到前面所做的MailBeantry{StringTokenizerst=newStringTokenizer(mailAddressField.getText(),"@");StringpopUser=st.nextToken();StringpopServer="pop."+st.nextToken();popserver.setText("用户"+popUser+",您所使用的邮件接收服务器是:"+popServer);StringpopPassword=String.valueOf(passwordField.getPassword());if(popPassword==null){JOptionPane.showMessageDialog(null,"您没有输入密码!");}if(popServer!=null&&popUser!=null&&popPassword!=null){receiveMail.setPopServer(popServer);receiveMail.setPopUser(popUser);receiveMail.setPopPassword(popPassword);//这里用到了一个receive方法,其参数是一个Mail对象,后面会给定义receive(receiveMail);}}catch(Exceptione){e.printStackTrace();}}B.4“接收”动作实现方法receiveButtonActionPerformed中用到的receive〔MailreceiveMail〕方法内容如下://receivemailFunction/***@parampopServer*@parampopUser*@parampopPassword*/publicvoidreceive(MailreceiveMail){StringpopServer=receiveMail.getPopServer();StringpopUser=receiveMail.getPopUser();StringpopPassword=receiveMail.getPopPassword();Storestore=null;Folderfolder=null;try{Propertiesprops=System.getProperties();Sessionsession=Session.getDefaultInstance(props,null);store=session.getStore("pop3");store.connect(popServer,popUser,popPassword);folder=store.getDefaultFolder();if(folder==null)thrownewException("Nodefaultfolder");folder=folder.getFolder("INBOX");if(folder==null)thrownewException("NoPOP3INBOX");folder.open(Folder.READ_ONLY);Message[]msgs=folder.getMessages();for(intmsgNum=0;msgNum<msgs.length;msgNum++){printMessage(popServer,msgs[msgNum]);}}catch(Exceptionex){ex.printStackTrace();}finally{try{if(folder!=null)folder.close(false);if(store!=null)store.close();}catch(Exceptionex2){ex2.printStackTrace();}}}B.5receive方法中调用的printMessage仅仅是为了将一些邮件信息反映到GUI界面上,这里就不再详解了,代码如下://print/***@parammessage*/publicvoidprintMessage(StringpopServer,Messagemessage){//TODOAuto-generatedmethodstubtry{Stringfrom=((InternetAddress)message.getFrom()[0]).getPersonal();if(from==null)from=((InternetAddress)message.getFrom()[0]).getAddress();statusLable.setText("成功从"+popServer+"接收到邮件!");mailFrom.setText(from+"<"+String.valueOf(message.getFrom()[0])+">");Stringsubject=message.getSubject();this.subject.setText(subject);PartmessagePart=message;Objectcontent=messagePart.getContent();if(contentinstanceofMultipart){messagePart=((Multipart)content).getBodyPart(0);}StringcontentType=messagePart.getContentType();if(contentType.startsWith("text/plain")||contentType.startsWith("text/html")){this.contentType.setText("文本");InputStreamis=messagePart.getInputStream();BufferedReaderreader=newBufferedReader(newInputStreamReader(is));StringthisLine=reader.readLine();StringBufferlineBuffer=newStringBuffer();while(thisLine!=null){System.out.println(thisLine);lin

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论