资源预览内容
第1页 / 共24页
第2页 / 共24页
第3页 / 共24页
第4页 / 共24页
第5页 / 共24页
第6页 / 共24页
第7页 / 共24页
第8页 / 共24页
第9页 / 共24页
第10页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第九章第九章 Java Mail 编程编程www.wetherm-tmall.com1JavaMail基础知识2发送简单邮件 3发送SMTP身份认证的邮件 4接收邮件 5邮件附件的处理 本章主要内容1JavaMail基础知识 2发送简单邮件 3发送SMTP身份认证的邮件 4接收邮件 5邮件附件的处理 常见电子邮件协议常见电子邮件协议 n nSMTP (Simple Mail Transfer Protocol,简单邮件传输协议) n nPOP(Post Office Protocol,邮局协议) n nIMAP(Internet Message Access Protocol,Internet 消息访问协议) n nMIME(Multipurpose Internet Mail Extensions,多用途Internet 邮件扩展标准)不是邮件传输协议,它只定义了需要传输的消息、附件及其他类型数据的格式。 n nJava Mail体系可以分为三层:n n抽象层抽象层n nInternet Internet 邮件实现层邮件实现层n n协议实现层协议实现层 n nJava MailJava Mail抽象层:该层定义了用于邮件处理功能的抽象层:该层定义了用于邮件处理功能的抽象类、接口和抽象方法,所有的邮件系统都支抽象类、接口和抽象方法,所有的邮件系统都支持这些功能,它独立于供应商和协议消息。抽象持这些功能,它独立于供应商和协议消息。抽象层位于层位于Java Mail Java Mail 顶级包(即顶级包(即javax.mailjavax.mail)内。)内。n n Internet Internet 邮件实现层:该层实现了部分抽象层元素,邮件实现层:该层实现了部分抽象层元素,它遵循它遵循Internet Internet 标准标准RFC822RFC822和和MIMEMIME。Internet Internet 邮邮件实现层所定义的类和接口大多位于件实现层所定义的类和接口大多位于javax.mail.internetjavax.mail.internet 包内。包内。n n协议实现层:该层由服务提供商实现对特定协议协议实现层:该层由服务提供商实现对特定协议的支持,如的支持,如SMTPSMTP、POPPOP、IMAP IMAP 和和NNTPNNTP。Sun Sun 为为开发者提供了很完备的一组协议的支持。开发者提供了很完备的一组协议的支持。n n核心核心Java Mail API Java Mail API 可以分为两部分,一部分由七个可以分为两部分,一部分由七个主要对象组成:主要对象组成:SessionSession、MessageMessage、AddressAddress、AuthenticatorAuthenticator、TransportTransport、Store Store 和和FolderFolder,利用这,利用这些对象可以完成包括发送消息、检索消息、删除些对象可以完成包括发送消息、检索消息、删除消息、认证、回复消息、转发消息、管理附件、消息、认证、回复消息、转发消息、管理附件、处理基于处理基于HTML HTML 文件格式的消息及搜索或过滤邮文件格式的消息及搜索或过滤邮件列表等任务件列表等任务 n n核心核心Java Mail API Java Mail API 的另一部分的主要接口和类包括的另一部分的主要接口和类包括PartPart、MessageMessage、BodypartBodypart、MultipartMultipart、MimePartMimePart、MimeMessageMimeMessage、MimiBodypartMimiBodypart 和和MimeMultipartMimeMultipart,可,可以用这些类和接口完成电子邮件的阅读、撰写等以用这些类和接口完成电子邮件的阅读、撰写等任务。任务。 1JavaMail基础知识2发送简单邮件 3发送SMTP身份认证的邮件 4接收邮件 5邮件附件的处理 程序程序82:SendMail.java(片断)(片断)n ntrytryn nProperties props = new Properties();Properties props = new Properties();n nSession Session sendMailSessionsendMailSession; ;n nStore Store storestore; ;n nTransport Transport transporttransport; ; n nsendMailSessionsendMailSession = = Session.getInstance(propsSession.getInstance(props, null);, null);n nprops.put(mail.smtp.hostprops.put(mail.smtp.host, host);, host);n nMessage Message newMessagenewMessage = new = new MimeMessage(sendMailSessionMimeMessage(sendMailSession); );n nnewMessage.setFrom(newnewMessage.setFrom(new InternetAddress(request.getParameter(fromInternetAddress(request.getParameter(from););n nnewMessage.setRecipient(Message.RecipientType.TOnewMessage.setRecipient(Message.RecipientType.TO, new , new InternetAddressInternetAddress ( ( request.getParameterrequest.getParameter (to); (to);n nnewMessage.setSubject(request.getParameter(subjectnewMessage.setSubject(request.getParameter(subject););n nnewMessage.setSentDate(newnewMessage.setSentDate(new Date(); Date();n nnewMessage.setText(request.getParameter(textnewMessage.setText(request.getParameter(text););n nTransport.send(newMessageTransport.send(newMessage); );n n / /显示发送成功的提示显示发送成功的提示n n out.printlnout.println( the Email send ( the Email send sucesssucess!);!);Java Mail API 的中文问题。的中文问题。n n如果开发者使用setSubject()方法直接设定中文的主题或者使用setText()方法直接指定中文内容,那么在使用Outlook 等客户端软件查看邮件时客户有可能看到的将是一团乱码。n n解决方案?只需要指定邮件主题和邮件正文的字符集为“ISO-8859-1” 即可。 1JavaMail基础知识 2发送简单邮件 3发送SMTP身份认证的邮件 4接收邮件 5邮件附件的处理 n n为了防止恶意用户利用SMTP 服务器进行发送垃圾邮件等破坏活动,SMTP 服务器一般需要身份验证。只有通过了身份验证的用户才有权利利用SMTP 服务器发送邮件。 n njavaMailjavaMail 用类用类javax.mail.Authenticatorjavax.mail.Authenticator来进行用户认证。验来进行用户认证。验证信息需要通过证信息需要通过Session Session 传给邮件服务器,所以传给邮件服务器,所以Session Session 对对象的象的getInstancegetInstance 有以下的变形有以下的变形n nstatic Session static Session getInstance(PropertiesgetInstance(Properties prop,Authenticatorprop,Authenticator auth); auth);n nstatic Session static Session getDefaultInstance(PropertiesgetDefaultInstance(Properties prop,Authenticatorprop,Authenticator auth); auth);n n其中的其中的Authenticator Authenticator 负责密码校验。如果不需要验证身份,负责密码校验。如果不需要验证身份,就用就用null null 做第二个参数,或者直接用单参数的做第二个参数,或者直接用单参数的getInstancegetInstance。如果如果Session Session 是需要密码的,那么是需要密码的,那么Session Session 会自动发出如下会自动发出如下调用调用n njavax.mail.PasswordAuthenticationjavax.mail.PasswordAuthentication getPasswordAuthenticationgetPasswordAuthentication();();n nPasswordAuthenticationPasswordAuthentication 只是一个包装类,里面包了用户名只是一个包装类,里面包了用户名和密码。因此如果要实现和密码。因此如果要实现SMTPSMTP认证的邮件发送,必须首认证的邮件发送,必须首先自己定义一个继承先自己定义一个继承javax.mail.Authenticatiorjavax.mail.Authenticatior的类。的类。 n n程序程序8 84:Auth.java4:Auth.javan nimport import javax.mail.Authenticatorjavax.mail.Authenticator; ;n nimport import javax.mail.PasswordAuthenticationjavax.mail.PasswordAuthentication; ;n npublic class Auth extends Authenticator public class Auth extends Authenticator n nString username=;String username=;n nString password=;String password=;n n public public Auth(StringAuth(String username,Stringusername,String password) password)n n this.usernamethis.username=username;=username;n n this.passwordthis.password=password;=password;n n n npublic public PasswordAuthenticationPasswordAuthentication getPasswordAuthenticationgetPasswordAuthentication()()n n return new return new PasswordAuthenticationPasswordAuthentication( username, password);( username, password);n n n n 程序程序85: sendAuthmail.java(片段)(片段)n n/初始化收件人邮件地址、发件人邮件地址和主机名,下面的各初始化字符串均为任意设置初始化收件人邮件地址、发件人邮件地址和主机名,下面的各初始化字符串均为任意设置n nString to = String to = teacherhyl.comteacherhyl.com; ;n nString from = String from = studenthyl.comstudenthyl.com; ;n nString host =127.0.0.1 ;String host =127.0.0.1 ;n n/创建一个属性对象创建一个属性对象n nProperties props = new Properties();Properties props = new Properties();n n/指定发送邮件服务器,使用指定发送邮件服务器,使用smtpsmtp 协议协议n nprops.put(mail.smtp.hostprops.put(mail.smtp.host, host);, host);n nprops.put(mail.smtp.auth,trueprops.put(mail.smtp.auth,true); ); n n Auth au=new Auth(hyl,123456); Auth au=new Auth(hyl,123456);n n / /获取会话获取会话n nSession Session sessionsession = = Session.getInstance(propsSession.getInstance(props, au);, au);n ntry try n n/创建消息,设置邮件发件人地址、收件人地址、主题创建消息,设置邮件发件人地址、收件人地址、主题n nMimeMessageMimeMessage msgmsg = new = new MimeMessage(sessionMimeMessage(session); );n nmsg.setFrom(newmsg.setFrom(new InternetAddress(fromInternetAddress(from););n nmsg.addRecipient(Message.RecipientType.TOmsg.addRecipient(Message.RecipientType.TO, new , new InternetAddress(toInternetAddress(to););n nmsg.setSubject(sendmsg.setSubject(send Example); Example);n n / / 开始设置消息内容开始设置消息内容n nmsg.setSentDate(newmsg.setSentDate(new Date(); Date();n nString text=Hi, this is Email by authentication!;String text=Hi, this is Email by authentication!;n nmsg.setText(textmsg.setText(text); );n n/ / 发送邮件发送邮件n nTransport.send(msgTransport.send(msg); );n n/显示发送成功的提示显示发送成功的提示n n out.printlnout.println( the Email send ( the Email send sucesssucess!);!);n n catch ( catch (MessagingExceptionMessagingException e) e)n n n n / /异常处理异常处理n n out.printlnout.println( the Email send failed!);( the Email send failed!);n n out.println(e.toStringout.println(e.toString();();n n 1JavaMail基础知识2发送简单邮件 3发送SMTP身份认证的邮件 4接收邮件 5邮件附件的处理 n n接收邮件过程比较简单,但是接收的方式和服务器有很大的关系:是IMAP的服务器还是普通的POP服务器,支持多少个文件夹,支持多少种邮件标记。这些都需要事先了解好或者用程序去探测。 1JavaMail基础知识2发送简单邮件 3发送SMTP身份认证的邮件 4接收邮件 5邮件附件的处理 发送附件发送附件 n n发送附件非常像转发消息,程序开发人员需要建发送附件非常像转发消息,程序开发人员需要建立各部分以组成完整消息,完成消息正文后,即立各部分以组成完整消息,完成消息正文后,即开始添加其他部件,其中每个开始添加其他部件,其中每个 DataHandlerDataHandler 都代表都代表附件,而不是转发消息情况下的共享处理程序。附件,而不是转发消息情况下的共享处理程序。如果从文件中读附件,附件的数据源是如果从文件中读附件,附件的数据源是 FileDataSourceFileDataSource。而如果从。而如果从 URL URL 中读时,附件的数中读时,附件的数据源是据源是 URLDataSourceURLDataSource。一旦存在。一旦存在 DataSourceDataSource,只,只要先把它传递给要先把它传递给 DataHandlerDataHandler 构造器,最后再用构造器,最后再用 setDataHandlersetDataHandler() () 把它附加到把它附加到 BodyPartBodyPart。假定要保。假定要保留附件的原始文件名,最终要做的是用留附件的原始文件名,最终要做的是用 BodyPartBodyPart 的的 setFileNamesetFileName() () 方法设置与附件相关的文件名。方法设置与附件相关的文件名。程序程序812:SendAttachmentMail.java(片段)(片段)n n /正文部分正文部分n nBodyPartBodyPart messageBodyPartmessageBodyPart = new = new MimeBodyPartMimeBodyPart(); (); n n/ Fill the message/ Fill the messagen nString String contentMessagecontentMessage= =request.getParameter(bodyrequest.getParameter(body););n nmessageBodyPart.setText(contentMessagemessageBodyPart.setText(contentMessage); ); n nMultipart Multipart multipartmultipart = new = new MimeMultipartMimeMultipart();();n nmultipart.addBodyPart(messageBodyPartmultipart.addBodyPart(messageBodyPart); ); n n/ Part two is attachment/ Part two is attachmentn nString filename=String filename=request.getParameter(thefilerequest.getParameter(thefile););n nmessageBodyPartmessageBodyPart = new = new MimeBodyPartMimeBodyPart();();n nDataSourceDataSource source = new source = new FileDataSource(filenameFileDataSource(filename); );n nmessageBodyPart.setDataHandler(newmessageBodyPart.setDataHandler(new DataHandler(sourceDataHandler(source););n nmessageBodyPart.setFileName(filenamemessageBodyPart.setFileName(filename); );n nmultipart.addBodyPart(messageBodyPartmultipart.addBodyPart(messageBodyPart); ); n n/ Put parts in message/ Put parts in messagen nmimeMsg.setContent(multipartmimeMsg.setContent(multipart); ); n n/ Send the message/ Send the messagen nTransport.send(mimeMsgTransport.send(mimeMsg); ); 接收附件接收附件 n n从邮件中获取附件比发送它们要困难,因为从邮件中获取附件比发送它们要困难,因为 MIME MIME 没有简没有简单的关于附件的概念。当消息包含附件时,消息的内容是单的关于附件的概念。当消息包含附件时,消息的内容是个个 Multipart Multipart 对象。接着,开发者需要处理每个对象。接着,开发者需要处理每个 PartPart,获取,获取主要内容和附件。标有从主要内容和附件。标有从 part.getDispositionpart.getDisposition() () 获得的获得的 Part.ATTACHMENTPart.ATTACHMENT 配置(配置(dispositiondisposition)的部件()的部件(PartPart)无)无疑就是附件。但是,没有配置(及一个非文本疑就是附件。但是,没有配置(及一个非文本 MIME MIME 类型)类型)和带和带 Part.INLINEPart.INLINE 配置的部件也可能是附件。当配置要么配置的部件也可能是附件。当配置要么是是 Part.ATTACHMENTPart.ATTACHMENT,要么是,要么是 Part.INLINEPart.INLINE 时,这个消时,这个消息部件的内容就能被保存。只要用息部件的内容就能被保存。只要用 getFileNamegetFileName() () 和和 getInputStreamgetInputStream() () 就能分别得到原始文件名和输入流。就能分别得到原始文件名和输入流。 程序程序813: ReceiveMimeMail.java(片段)(片段)n n Multipart mp = (Multipart mp = (Multipart)messagenid.getContentMultipart)messagenid.getContent();();n n String String szFileszFile=;=;n n File File ffileffile; ;n n /String /String szpathszpath=;=;n n for ( for (intint i=0,n= i=0,n=mp.getCountmp.getCount(); in; i+) (); in; i+) n n Part Part partpart = = mp.getBodyPart(imp.getBodyPart(i); );n n String String szMbpszMbp= =part.getContentTypepart.getContentType();();n n System.out.println(IDXSystem.out.println(IDX: + i+ : + i+ :类型类型 + + szMbpszMbp); );n n String disposition = String disposition = part.getDispositionpart.getDisposition();();n nif(dispositionif(disposition != null) & ( != null) & (disposition.equals(Part.ATTACHMENT)|(disposition.equals(Part.INLINEdisposition.equals(Part.ATTACHMENT)|(disposition.equals(Part.INLINE)n n / /创建一个文件创建一个文件, ,并从输入流中读取字节,并从输入流中读取字节,, ,存入到文件中存入到文件中n n szFileszFile= =MimeUtility.decodeText(part.getFileNameMimeUtility.decodeText(part.getFileName();();n nString String fullpathfullpath= =filepathfilepath + + szFileszFile; ;n n ffileffile = new = new File(fullpathFile(fullpath); ); n n FileOutputStreamFileOutputStream outfileoutfile = new = new FileOutputStream(ffileFileOutputStream(ffile); );n nBufferedInputStreamBufferedInputStream brbr = new = new BufferedInputStream(part.getInputStreamBufferedInputStream(part.getInputStream();();n nBufferedOutputStreamBufferedOutputStream bwbw = new = new BufferedOutputStream(outfileBufferedOutputStream(outfile); );n n intint b; b;n n while (b = while (b = br.readbr.read() != () != 1) 1) bw.write(bbw.write(b); );n n bw.flushbw.flush();();n n szAttachszAttach= =szAttachszAttach+ + +fullpathfullpath ; ;n n else else if(dispositionif(disposition= =null)= =null)n n MimeBodyPartMimeBodyPart mbpmbp = ( = (MimeBodyPart)partMimeBodyPart)part; ;n nif (if (mbp.isMimeType(text/plain)|mbp.isMimeType(text/htmlmbp.isMimeType(text/plain)|mbp.isMimeType(text/html) /) /普通正文普通正文n n szBodyszBody= =mbp.getContent().toStringmbp.getContent().toString();();n n szBodyszBody= =szBody.replaceAll(rnszBody.replaceAll(rn,););n nelse else if(mbp.isMimeType(multipartif(mbp.isMimeType(multipart/alternative) /HTML/alternative) /HTML正文正文n n szBodyszBody=(Multipart)part.getContent().getBodyPart(0).getContent().toString();=(Multipart)part.getContent().getBodyPart(0).getContent().toString();n n n n n n n n
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号