javamail应用五(详解PropertiesSession).doc_第1页
javamail应用五(详解PropertiesSession).doc_第2页
javamail应用五(详解PropertiesSession).doc_第3页
javamail应用五(详解PropertiesSession).doc_第4页
javamail应用五(详解PropertiesSession).doc_第5页
全文预览已结束

下载本文档

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

文档简介

1Properties(属性对象)由于JavaMail需要和邮件服务器进行通信,这就要求程序提供许多诸如服务器地址、端口、用户名、密码等信息,JavaMail通过Properties对象封装这些属性西信息。如下面的代码封装了两个属性信息: Properties props = new Properties(); props.put(mail.smtp.host, ); props.put(mail.smtp.auth, true);针对不同的的邮件协议,JavaMail规定了服务提供者必须支持一系列属性,下表是针对SMTP协议的一些常见属性(属性值都以String类型进行设置,属性类型栏仅表示属性是如何被解析的):属性名属性类型说明mail.stmp.hostStringSMTP服务器地址,如mail.stmp.portintSMTP服务器端口号,默认为25mail.stmp.authbooleanSMTP服务器是否需要用户认证,默认为falsemail.stmp.userStringSMTP默认的登陆用户名mail.stmp.fromString默认的邮件发送源地址mail.stmp.socketFactory.classStringsocket工厂类类名,通过设置该属性可以覆盖提供者默认的实现,必须实现.SocketFactory接口mail.stmp.socketFactory.portint指定socket工厂类所用的端口号,如果没有规定,则使用默认的端口号mail.smtp.socketFactory.fallbackboolean设置为true时,当使用指定的socket类创建socket失败后,将使用.Socket创建socket,默认为truemail.stmp.timeoutintI/O连接超时时间,单位为毫秒,默认为永不超时其他几个协议也有类似的一系列属性,如POP3的mail.pop3.host、mail.pop3.port以及IMAP的mail.imap.host、mail.imap.port等。更详细的信息请查看com.sun.mail.smtp、com.sun.mail.pop3和com.sun.mail.imap这三个包的Javadoc:/products/javamail/javadocs/index.html。2Session(会话对象)Session是一个很容易被误解的类,这归咎于混淆视听的类名。千万不要以为这里的Session像HttpSession一样代表真实的交互会话,但创建Session对象时,并没有对应的物理连接,它只不过是一对配置信息的集合。Session的主要作用包括两个方面:1接收各种配置属性信息:通过Properties对象设置的属性信息;2初始化JavaMail环境:根据JavaMail的配置文件,初始化JavaMail环境,以便通过Session对象创建其他重要类的实例。所以,如果把Session更名为Configure也许更容易理解一些。Session通过JavaMail配置文件以及程序中设置的Properties对象构建一个邮件处理环境,后续的处理将在Session基础上进行。Session拥有多个静态工厂方法用于创建Session实例。getInstance方法1static Session getDefaultInstance(Properties props, Authenticator authenticator):当JVM中已经存在默认的Session实例中,直接返回这个实例,否则创建一个新的Session实例,并将其作为JVM中默认Session实例。这个API很诡异,我们将对它进行详细的讲解。由于这个默认Session实例可以被同一个JVM所有的代码访问到,而Session中本身又可能包括密码、用户名等敏感信息在内的所有属性信息,所以后续调用也必须传入和第一次相同的Authenticator实例,否则将抛出java.lang.SecurityException异常。如果第一次调用时Authenticator入参为null,则后续调用通过null的Authenticator入参或直接使用getDefaultInstance(Properties props)即可返回这个默认的Session实例。值得一提的是,虽然后续调用也会传入Properties,但新属性并不会起作用,如果希望采用新的属性值,则可以通过getDefaultInstance(Properties props)创建一个新的Session实例达到目的。Authenticator在这里承当了两个功能:首先,对JVM中默认Session实例进行认证保护,后续调用执行getDefaultInstance(Properties props, Authenticator authenticator)方法时必须和第一次一样;其次,在具体和邮件服务器交互时,又作为认证的信息;2static Session getDefaultInstance(Properties props):返回JVM中默认的Session实例,如果第一次创建Session未指定Authenticator入参,后续调用可以使用该访问获取Session;3static Session getInstance(Properties props, Authenticator authenticator):创建一个新的Session实例,它不会在JVM中被作为默认实例共享;4static Session getInstance(Properties props):根据相关属性创建一个新的Session实例,未使用安全认证信息; Session是JavaMail提供者配置文件以及设置属性信息的“容器”,Session本身不会和邮件服务器进行任何的通信。所以在一般情况下,我们仅需要通过getDefaultInstance()获取一个共享的Session实例就可以了,下面的代码创建了一个Session实例:Properties props = System.getProperties();props.setProperty(tocol, smtp); Session session = Session.getDefaultInstance(props);注意:要观察传到邮件服务器上的邮件命令,请用 session.setDebug(true) 设置调试标志。3Transport和Store(传输和存储)邮件操作只有发送或接收两种处理方式,JavaMail将这两种不同操作描述为传输(javax.mail.Transport)和存储(javax.mail.Store),传输对应邮件的发送,而存储对应邮件的接收。Session提供了几个用于创建Transport和Store实例的方法,在具体讲解这些方法之前,我们事先了解一下Session创建Transport和Store的内部机制。我们知道提供者在viders配置文件中为每一种支持的邮件协议定义了实现类,Session根据协议类型(stmp、pop3等)和邮件操作方式(传输和存储)这两个信息就可以定位到一个实例类上。比如,指定stmp协议和transport类型后,Session就会使用com.sun.mail.smtp.SMTPTransport实现类创建一个Transport实例,而指定pop3协议和store类型时,则会使用com.sun.mail.pop3.POP3Store实例类创建一个Store实例。Session提供了多个重载的getTransport()和getStore()方法,这些方法将根据Session中Properties属性设置情况进行工作,影响这两套方法工作的属性包括:属性名说明tocol默认的邮件传输协议,例如,tocol默认的存储邮件协议,例如:pop3mail.host默认的邮件服务地址,例如:mail.user默认的登陆用户名,例如:zapldy下面,我们再回头来了解Session的getTransport()和getStore()的重载方法。Transport的getTransport()方法1Transport getTransport():当Session实例设置了tocol属性时,该方法返回对应的Transport实例,否则抛出javax.mail.NoSuchProviderException。2Transport getTransport(String protocol):如果Session没有设置tocol属性,可以通过该方法返回指定类型的Transport,如transport = session.getTransport(“smtp”)。如果Session中未包含Authenticator,以上两方法创建的Transport实例和邮件服务器交互时必须显示提供用户名/密码的认证信息。如果Authenticator非空,则可以在和邮件服务器交互时被作为认证信息使用。除了以上两种提供认证信息的方式外,Session还可以使用以下的方法为Transport提供认证信息。3Transport getTransport(URLName url):用户可以通过URLName入参指定邮件协议、邮件服务器、端口、用户名和密码信息,请看下面的代码:URLName urln = new URLName(“smtp”, “”, 25, null, “masterspring2”, “spring”);Transport transport = session.getTransport(urln);/ * 这里,指定了邮件协议为smtp,邮件服务器是,端口为25,用户名/ * 密码为masterspring2/spring。*/消息发送的最后一部分是使用 Transport 类。这个类用协议指定的语言发送消息(通常是 SMTP)。它是抽象类,它的工作方式与 Session 有些类似。仅调用静态 send() 方法,就能使用类的缺省版本:Transport.send(message);或者,您也可以从针对您的协议的会话中获得一个特定的实例,传递用户名和密码(如果不必要就不传),发送消息,然后关闭连接。message.saveChanges(); Transport transport = session.getTransport(smtp);transport.connect(host, username, password);transport.sendMessage(message, message.getAllRecipients();transport.close();后面这种方法在您要发送多条消息时最好,因为它能保持邮件服务器在消息间的活动状态。基本send()机制为每个方法的调用设置与服务器独立的连接。Store方法用 Session 获取消息与发送消息开始很相似。但是,在 session 得到后,很可能使用用户名和密码或使用 Authenticator 连接到一个 Store。类似于 Transport ,您告知 Store 使用什么协议:/ Store store = session.getStore(imap);Store store = session.getStore(pop3);store.connect(host, username, password);连接到 Store 之后,接下来,您就可以获取一个 Folder,您必需先打开它,然后才能读里面的消息。Folder folder = store.getFolder(INBOX);folder.open(Folder.READ_ONLY);Message message = folder.getMessages();POP3 唯一可以用的文件夹是 INBOX。如果使用 IMAP,还可以用其它文件夹。注意:Sun 的供应商有意变得聪明。虽然 Message message = folder.getMessages(); 看上去是个很慢的操作,它从服务器上读取每一条消息,但仅在你实际需要消息的一部分时,消息的内容才会被检索。一旦有了要读的 Message,您可以用 getContent() 来获取其内容,或者用 writeTo() 将内容写入流。getContent() 方法只能得到消息内容,而 writeTo() 的输出却包含消息头。System.out.println(MimeMessage)message).getContent();一旦读完邮件,要关闭与 folder 和 store 的连接。folder.close(aBoolean);store.close();传递给 folder 的 close() 方法的 boolean 表示是否清除已删除的消息从而更新 folder。4Message(消息对象)一旦获得Session对象,就可以继续创建要发送的消息。这由Message类来完成。因为 Message是个抽象类,您必需用一个子类,多数情况下为ernet.MimeMessage。MimeMessage是个能理解MIME类型和头的电子邮件消息,正如不同RFC中所定义的。虽然在某些头部域非ASCII字符也能被译码,但Message头只能被限制为用US-ASCII字符。要创建一个 Message,请将 Session 对象传递给 MimeMessage 构造器:MimeMessage message = new MimeMessage(session);注意:还存在其它构造器,如用按 RFC822 格式的输入流来创建消息。一旦获得消息,您就可以设置各个部分,因为Message实现Part接口(且MimeMessage实现MimePart)。设置内容的基本机制是setContent()方法,同时使用参数,分别代表内容和 mime类型:message.setContent(Hello, text/plain);但如果,您知道您在使用MimeMessage,而且消息是纯文本格式,您就可以用setText()方法,它只需要代表实际内容的参数,(MIME 类型缺省为 text/plain):message.setText(Hello);后一种格式是设置纯文本消息内容的首选机制。至于发送其它类型的消息,如HTML文件格式的消息,我们首选前者。用 setSubject() 方法设置 subject(主题):message.setSubject(First);5Address(地址)一旦您创建了Session和Message,并将内容填入消息后,就可以用Address确定信件地址了。和Message一样,Address也是个抽象类。您用的是ernet.InternetAddress 类。若创建的地址只包含电子邮件地址,只要传递电子邮件地址到构造器就行了。Address address = new InternetAddress();若希望名字紧挨着电子邮件显示,也可以把它传递给构造器:Address address = new InternetAddress(, George Bush);需要为消息的 from 域和 to 域创建地址对象。除非邮件服务器阻止,没什么能阻止你发送一段看上去是来自任何人的消息。一旦创建了 address(地址),将它们与消息连接的方法有两种。如果要识别发件人,您可以用 setFr

温馨提示

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

评论

0/150

提交评论