⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 java资源网 javamail api简介.htm

📁 JavaMail的应用程序合集 jsp的java 的
💻 HTM
📖 第 1 页 / 共 5 页
字号:
              <TBODY>
              <TR>
                <TD vAlign=top align=middle 
                background="Java资源网 JavaMail API简介.files/nyy_02.gif">
                  <TABLE height=20 cellSpacing=1 cellPadding=0 width="92%" 
                  border=0>
                    <TBODY>
                    <TR>
                      <TD width=3>
                        <TABLE height=22 cellSpacing=0 cellPadding=0 width=3 
                        border=0>
                          <TBODY>
                          <TR>
                            <TD bgColor=#8dc63f></TD></TR></TBODY></TABLE></TD>
                      <TD width=3></TD>
                      <TD width=157>
                        <TABLE cellSpacing=1 cellPadding=0 width="90%" 
                          border=0><TBODY>
                          <TR>
                            <TD class=n_gray_english vAlign=top><SPAN 
                              class=n_gray_english 
                              id=Label3>Articles</SPAN><SPAN class=n_black_none 
                              id=Label4> top 
                    热门文章</SPAN></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
                  <TABLE cellSpacing=0 cellPadding=0 width="92%" border=0>
                    <TBODY>
                    <TR>
                      <TD bgColor=#d8d6d8 height=1></TD></TR></TBODY></TABLE>
                  <TABLE cellSpacing=0 cellPadding=0 width="92%" border=0>
                    <TBODY>
                    <TR>
                      <TD bgColor=#f8f7f9 height=3></TD></TR></TBODY></TABLE>
                  <TABLE cellSpacing=0 cellPadding=0 width="92%" border=0>
                    <TBODY>
                    <TR>
                      <TD height=3></TD></TR></TBODY></TABLE>
                  <TABLE id=DataList_hotZT_new 
                  style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; WIDTH: 92%; BORDER-COLLAPSE: collapse; BORDER-RIGHT-WIDTH: 0px" 
                  cellSpacing=0 cellPadding=0 border=0>
                    <TBODY>
                    <TR>
                      <TD align=left>· <A 
                        href="http://www.javazy.com/contentex/20058585812.shtml" 
                        target=_blank>Eclipse基础--plugin插件安装(6644)</A></TD></TR>
                    <TR>
                      <TD align=left>· <A 
                        href="http://www.javazy.com/contentex/200579131155.shtml" 
                        target=_blank>eclipse+tomcat+lomboz的安装配置说明(4774)</A></TD></TR>
                    <TR>
                      <TD align=left>· <A 
                        href="http://www.javazy.com/contentex/200582215407.shtml" 
                        target=_blank>Java程序员就业前景(4584)</A></TD></TR>
                    <TR>
                      <TD align=left>· <A 
                        href="http://www.javazy.com/contentex/2005829151425.shtml" 
                        target=_blank>Windows下JAVA环境变量的设置祥解(3788)</A></TD></TR>
                    <TR>
                      <TD align=left>· <A 
                        href="http://www.javazy.com/contentex/200581610110.shtml" 
                        target=_blank>Tomcat下JSP、Servlet和JavaBean环境的配置(3716)</A></TD></TR>
                    <TR>
                      <TD align=left>· <A 
                        href="http://www.javazy.com/contentex/20058248475.shtml" 
                        target=_blank>使用links方式安装Eclipse插件(3698)</A></TD></TR>
                    <TR>
                      <TD align=left>· <A 
                        href="http://www.javazy.com/contentex/200572085049.shtml" 
                        target=_blank>一个老程序员的心理话(3533)</A></TD></TR>
                    <TR>
                      <TD align=left>· <A 
                        href="http://www.javazy.com/contentex/20057913446.shtml" 
                        target=_blank>linux下jdk的安装与配置(3459)</A></TD></TR>
                    <TR>
                      <TD align=left>· <A 
                        href="http://www.javazy.com/contentex/200572682653.shtml" 
                        target=_blank>初学者入门:Structs中基本配置入门(3334)</A></TD></TR>
                    <TR>
                      <TD align=left>· <A 
                        href="http://www.javazy.com/contentex/20058385338.shtml" 
                        target=_blank>Eclipse 
                  运行命令行参数大全(3084)</A></TD></TR></TBODY></TABLE>
                  <TABLE cellSpacing=0 cellPadding=0 width="92%" border=0>
                    <TBODY>
                    <TR>
                      <TD height=3></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
            <TABLE cellSpacing=0 cellPadding=0 width=189 border=0>
              <TBODY>
              <TR>
                <TD vAlign=top><IMG height=6 
                  src="Java资源网 JavaMail API简介.files/nyy_03.gif" 
              width=189></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD>
    <TD vAlign=top>
      <TABLE cellSpacing=3 cellPadding=3 width="100%" border=0>
        <TBODY>
        <TR>
          <TD><!--ad--></TD></TR>
        <TR>
          <TD align=middle>
            <TABLE class=buttomBorder cellSpacing=3 cellPadding=3 width="100%" 
            border=0>
              <TBODY>
              <TR>
                <TD class=biaoti align=left>您的位置:<A 
                  href="http://www.javazy.com/index.htm">首页</A>&gt;&gt;<A 
                  href="http://www.javazy.com/sortex/463_1.shtml">JavaMail</A>&gt;&gt;JavaMail 
                  API简介</TD></TR>
              <TR>
                <TD align=middle>
                  <SCRIPT type=text/javascript><!--
			google_ad_client = "pub-0899771615311458";
			google_ad_width = 468;
			google_ad_height = 60;
			google_ad_format = "468x60_as";
			google_ad_type = "image";
			//2007-04-20: TOP小横幅图片
			google_ad_channel = "9784471587";
			//-->
			</SCRIPT>

                  <SCRIPT src="Java资源网 JavaMail API简介.files/show_ads.js" 
                  type=text/javascript>
			</SCRIPT>
                </TD></TR>
              <TR>
                <TD class=contentTitle align=middle>JavaMail API简介 
                  <HR width="70%">
                </TD></TR>
              <TR>
                <TD align=middle>2005-08-16&nbsp; &nbsp;来源:CSDN 
                  &nbsp;作者:JCoder </TD></TR>
              <TR>
                <TD class=content vAlign=top 
                  align=left>JavaMail&nbsp;API是一种可选的、能用于读取、编写和发送电子消息的包(标准扩展)。您可使用这种包创建邮件用户代理(Mail&nbsp;User&nbsp;Agent&nbsp;,MUA)&nbsp;类型的程序,它类似于Eudora、Pine及Microsoft&nbsp;Outlook这些邮件程序。其主要目的不是像发送邮件或其他邮件传输代理(Mail&nbsp;Transfer&nbsp;Agent,MTA)类型的程序那样用于传输、发送和转发消息。换句话说,用户可以与MUA类型的程序交互,以阅读和撰写电子邮件。MUA依靠MTA处理实际的发送任务。<BR>JavaMail&nbsp;API的设计是,为收发信息提供与协议无关的访问。方式是把该API划分成两个部分:<BR>?&nbsp;该API的第一个部分是本课程的重点。基本上是如何发送和接收独立于提供程序/协议的消息。<BR>?&nbsp;第二个部分则使用特定的协议语言,如:SMTP、POP、IMAP和NNTP。如果要让JavaMail&nbsp;API与服务器通信,就需要为之提供协议。由于Sun公司对特定协议提供程序有充分的介绍,用户可以免费获取,所以本课程没有介绍创建特定协议提供程序的内容。<BR>复习相关协议<BR>在学习JavaMail&nbsp;API的深层知识之前,让我们回过头来看一看在该API中使用的协议,本质上有4种人们常用的协议:<BR>?&nbsp;SMTP<BR>?&nbsp;POP<BR>?&nbsp;IMAP<BR>?&nbsp;MIME<BR>您还需要了解NNTP及其他一些协议。理解这些协议的基本原理有助于您理解如何使用JavaMail&nbsp;API。而该API的设计要与协议无关,所以不能克服这些基础协议的限制。如果选用的协议不支持某种功能,那么JavaMail&nbsp;API也无法在其上添加这种功能。(正如您一会儿就会看到的,在操作POP协议时,常常会碰到这种问题)。<BR>SMTP<BR>简单邮件传输协议(SMTP)是用于传送电子邮件的机制。在JavaMail&nbsp;API环境中,您的基于JavaMail的程序将与您公司或Internet服务提供商(ISP)的SMTP服务器通信。该SMTP服务器将会把消息转发给用作接收消息的SMTP服务器,最后用户可通过POP或IMAP协议获取该消息。由于支持身份验证,所以不需要SMTP服务器是一种开放的转发器,但需要确保SMTP服务器配置正确。JavaMail&nbsp;API中没有集成用于处理诸如配置服务器以转发消息或添加/删除电子邮件帐户这一类任务的功能。<BR>POP<BR>POP的含义是邮局协议,当前的版本为3,也称作POP3,该协议是在RFC&nbsp;1939中定义的。POP是Internet上的大多数人用来接收邮件的机制。它为每个用户的每个邮箱定义支持,这是它所做的全部工作,也是大多数问题的根源。在使用POP协议时,人们熟悉的很多功能,如查看收到了多少新邮件消息的功能,POP根本不支持。这些功能都内置到诸如Eudora或Microsoft&nbsp;Outlook之类的邮件程序中,能为您记住接收的上一封邮件,以及计算有多少新邮件这类信息。因此,使用JavaMail&nbsp;API时,如果想获取这类信息,将需要由自己进行计算。<BR>IMAP<BR>IMAP是用于接收消息的更加高级的协议,它是在RFC&nbsp;2060中定义的。IMAP的含义是“Internet消息访问协议”,当前版本是第4版,也称作IMAP4。使用IMAP时,您的邮件服务器必须支持该协议。您不能只是简单地把程序转变为支持IMAP,而不是支持POP,就指望能支持IMAP中的一切。假定您的邮件服务器支持IMAP,那么基于JavaMail的程序就可利用在服务器上拥有多个文件夹的用户,并且这些文件夹可以被多个用户共享的功能。<BR>由于IMAP协议具有更高级的功能,您也许会想IMAP应该被每一个人使用,但事实不是这样。因为IMAP会加重邮件服务器的负荷,它需要服务器接收新消息,发送消息给请求的用户,并在多个文件夹中为每个用户维护这些消息。而这要集中备份,因而长期下去用户的文件夹会变得越来越大,当磁盘空间用光了时,每个人都会遭受损失。而使用POP协议时,已保存消息可以解除服务器的重负。<BR>MIME<BR>MIME的含义是“多用途的网际邮件扩充协议”。它不是一种邮件传输协议,相反,它定义传输的内容:消息的格式、附件等。许多文档都定义了MIME协议,包含:RFC&nbsp;822、RFC&nbsp;2045、RFC&nbsp;2046和RFC&nbsp;2047。作为JavaMail&nbsp;API的用户,一般不需要担心这些格式。但是,这些格式确实存在,并为您的程序所用。<BR>NNP和其他协议<BR>由于JavaMail&nbsp;API分开了提供程序和其他部分,所以您可以轻松地为附加协议添加支持。Sun公司提供第3方提供程序清单,这些提供程序要利用&nbsp;Sun公司不支持的少见的协议。在这份清单中,您将会看到对NNTP(网络新闻传输协议)[新闻组]、S/MIME(安全多用途的网际邮件扩充协议)及其他协议的提供支持的第3方提供程序。<BR>安装<BR>目前有两种版本的JavaMail&nbsp;API最常用:1.2和1.1.3。本课程中的所有例子都适用于这两种版本。其中JavaMail&nbsp;API&nbsp;1.2是最新的,而JavaMail&nbsp;API&nbsp;1.1.3中包含了Java&nbsp;2企业版(J2EE)平台1.2.1版,所以它仍然很常用。使用JavaMail&nbsp;API的版本会对您的下载和安装产生一些影响。这两种版本的JavaMail&nbsp;API都能与JDK&nbsp;1.1.6、Java&nbsp;2标准版(J2SE)平台1.2.x和1.3.x协同工作。<BR>注意:在安装了Sun公司的JavaMail工具后,会在演示目录下看到许多示例程序。<BR>安装JavaMail&nbsp;1.2<BR>要使用JavaMail&nbsp;1.2&nbsp;API,可以下载JavaMail&nbsp;1.2工具,然后解压缩javamail-1_2.zip文件,并把mail.jar文件添加到典型安装路径下。JavaMail&nbsp;1.2工具带有SMTP、IMAP4和POP3提供程序以及核心类。<BR>安装完JavaMail&nbsp;1.2后,再安装JavaBeans&nbsp;Activation&nbsp;Framework。<BR>安装JavaMail&nbsp;1.1.3<BR>要使用JavaMail&nbsp;1.1.3&nbsp;API,可以下载JavaMail&nbsp;1.1.3工具,然后解压缩javamail1_1_3.zip文件,并把mail.jar文件添加到典型安装路径下。JavaMail&nbsp;1.1.3工具带有SMTP和IMAP4提供程序以及核心类。<BR>如果您想用JavaMail&nbsp;1.1.3访问POP服务器,需要下载并安装POP3提供程序。Sun公司拥有一个独立于&nbsp;JavaMail&nbsp;工具的提供程序。在下载并解压缩pop31_1_1.zip文件后,也还需要把pop3.jar添加到典型安装路径下。<BR>安装完JavaMail&nbsp;1.1.3后,再安装JavaBeans&nbsp;Activation&nbsp;Framework。<BR>安装JavaBeans&nbsp;Activation&nbsp;Framework<BR>JavaMail&nbsp;API的所有版本都需要JavaBeans&nbsp;Activation&nbsp;Framework(JavaBeans激活框架),这种框架提供了对输入任意数据块的支持,并能相应地对其进行处理。看上去效果好像不太好,但该框架是在当今的许多浏览器和邮件工具中可以找到的基本MIME类型支持。下载该框架后,解压缩jaf1_0_1.zip文件,并将activation.jar文件添加到典型安装路径下。<BR>对于JavaMail&nbsp;1.2用户,现在应该把mail.jar和activation.jar文件添加到典型安装路径下。<BR>对于JavaMail&nbsp;1.1.3用户,现在应该把mail.jar、pop3.jar和activation.jar添加到典型安装路径下。如果您不打算使用POP3,就不需要把pop3.jar文件添加到典型安装路径下。<BR>如果您不想更改安装路径环境变量,可以把JAR文件复制到Java运行时环境(JRE)目录下的lib/ext目录下。例如,对于J2SE&nbsp;1.3版本,Windows平台上的默认目录应该是C:\jdk1.3\jre\lib\ext。<BR>使用Java&nbsp;2企业版<BR>如果您使用的是J2EE,则在使用基本JavaMail&nbsp;API时,不需要做什么特殊的工作;JavaMail&nbsp;API带有J2EE类。只要确保j2ee.jar文件位于典型安装路径下,并完成了所有的设置工作。&nbsp;<BR>对于J2EE&nbsp;1.2.1,POP3提供程序是单独提供的,因此需要下载该提供程序,并按安装JavaMail&nbsp;1.1.3的步骤,在J2EE&nbsp;1.2.1中包含POP3提供程序。J2EE&nbsp;1.3的用户会获得J2EE和POP3提供程序,因而不需要对POP3提供程序执行独立安装。使用这两种版本的J2EE用户,都不需要安装JavaBeans&nbsp;Activation&nbsp;Framework。<BR>练习<BR>设置您的&nbsp;JavaMail&nbsp;环境。<BR>复习核心类<BR>在开始深入研究JavaMail类之前,首先让用户浏览一下构成API的核心类:会话、消息、地址、验证程序、传输,存储和文件夹。所有这些类都可以在JavaMail&nbsp;API即javax.mail的顶层包中找到,尽管您将频繁地发现您自己使用的子类是在javax.mail.internet包中找到的。<BR>Session类<BR>Session类定义了一个基本的邮件会话。通过该会话可让别的工作顺利执行。Session对象利用java.util.Properties对象获取诸如邮件服务器、用户名、密码等信息,以及其他可在整个应用程序中共享的信息。<BR>Session类的构造器是私有的。您可以获得一个可被getDefaultInstance()方法共享的单一的默认会话:<BR>Properties&nbsp;props&nbsp;=&nbsp;new&nbsp;Properties();<BR>//&nbsp;fill&nbsp;props&nbsp;with&nbsp;any&nbsp;information<BR>Session&nbsp;session&nbsp;=&nbsp;Session.getDefaultInstance(props,&nbsp;null);<BR>或者,您可以用getInstance()方法创建一个独特的会话:<BR>Properties&nbsp;props&nbsp;=&nbsp;new&nbsp;Properties();<BR>//&nbsp;fill&nbsp;props&nbsp;with&nbsp;any&nbsp;information<BR>Session&nbsp;session&nbsp;=&nbsp;Session.getInstance(props,&nbsp;null);<BR>这两种情形下的null参数都是一种Authenticator对象,它不是在此时使用的。详细信息请参阅其后的“Autherticator”一节。<BR>在大多数情况下,使用共享会话就足够了,即使为多个用户邮箱处理邮件会话也是如此。您可以在通信过程的后面一步添加上用户名和密码的组合,并保持所有的一切是独立的。<BR>Message类<BR>一旦创建了自己的Session对象,就是该去创建要发送的消息的时候了。这时就要用到消息类型。作为一个抽象类,您必须操作一个子类,在大多数情况下,该子类是javax.mail.internet.MimeMessage。一个MimeMessage是一种理解MIME类型和报头(在不同的RFC文档中均有定义)的消息。消息的报头被严格限制成只能使用US-ASCII字符,尽管非ASCII字符可以被编码到某些报头字段中。<BR>可以通过将Session对象传递给MimeMessage构造器的方法来创建消息:<BR>MimeMessage&nbsp;message&nbsp;=&nbsp;new&nbsp;MimeMessage(session);<BR>注意:还有其他的构造器,像用于创建消息的源于RFC822格式化的输入流的构造器。<BR>一旦创建了消息,就可以设置其各个部分,如Message(消息)实现Part(部分)接口(以MimeMessage实现MimePart)。设置内容的基本机制是setContent()方法,它带有表示内容和MIME类型的参数:<BR>message.setContent("Hello",&nbsp;"text/plain");<BR>但是,如果正在使用&nbsp;MimeMessage,并且您的消息是纯文本,那么您就可以使用setText()方法。该方法只需要一个表示实际内容的参数,默认的MIME类型为纯文本:<BR>message.setText("Hello");<BR>对于纯文本消息,setText()方法更常常被用来设置内容。要发送其他类型的消息,如HTML消息,就要使用setContent方法()。现在用的更多的是HTML消息。<BR>要设置主题,可以使用setSubject()方法:<BR>message.setSubject("First");<BR>Address类<BR>一旦创建了会话和消息,并为消息填充了内容,就需要用Address类为您的信件标上地址了。同Message类一样,Address类也是一种抽象类。您可以使用javax.mail.internet.InternetAddress类。<BR>要创建只带有电子邮件地址的地址,可以把电子邮件地址传递给Address类的构造器:<BR>Address&nbsp;address&nbsp;=&nbsp;new&nbsp;InternetAddress("president@whitehouse.gov");<BR>如果想让一个名字出现在电子邮件地址后,也可以将其传递给构造器:<BR>Address&nbsp;address&nbsp;=&nbsp;new&nbsp;InternetAddress("president@whitehouse.gov",&nbsp;"George&nbsp;Bush");<BR>您要为消息的from(发送者)字段和to(接收者)字段创建地址对象。除非您的邮件服务器阻止这样做,否则要在发送的消息中注明该消息的发送者。<BR>一旦创建好了地址,有两种方法可让您将地址与消息连接起来。为了鉴别发送者,您可以使用setFrom()和setReplyTo()方法。<BR>message.setFrom(address)<BR>如果您的消息需要显示多个地址来源,则可以使用addFrom()方法:<BR>Address&nbsp;address[]&nbsp;=&nbsp;...;<BR>message.addFrom(address);<BR>为了鉴别消息接收者,您可以使用addRecipient()方法。该方法除了需要一个地址参数外,还需要一个Message.RecipientType属性(消息的接收类型)。<BR>message.addRecipient(type,&nbsp;address)<BR>地址的3种预定义类型如下:<BR>?&nbsp;Message.RecipientType.TO&nbsp;<BR>?&nbsp;Message.RecipientType.CC&nbsp;<BR>?&nbsp;Message.RecipientType.BCC&nbsp;<BR>因此,如果一条消息将发送给副总统,同时还将发送该消息的副本给第一夫人,则采用下面的代码:<BR>Address&nbsp;toAddress&nbsp;=&nbsp;new&nbsp;InternetAddress("vice.president@whitehouse.gov");<BR>Address&nbsp;ccAddress&nbsp;=&nbsp;new&nbsp;InternetAddress("first.lady@whitehouse.gov");<BR>message.addRecipient(Message.RecipientType.TO,&nbsp;toAddress);<BR>message.addRecipient(Message.RecipientType.CC,&nbsp;ccAddress);<BR>JavaMail&nbsp;API没有提供检查电子邮件地址有效性的机制。您可以自己编写支持扫描有效字符(在RFC&nbsp;822文档中所定义的)的程序或检验MX(邮件交换)记录,这些都超越了JavaMail&nbsp;API的范围。<BR>Authenticator类<BR>与java.net类一样,JavaMail&nbsp;API可以利用Authenticator(验证程序)类通过用户名和密码来访问受保护的资源。对于JavaMail&nbsp;API来说,这种受保护的资源是指邮件服务器。JavaMail的Authenticator类可以在javax.mail包中找到,并有别于同名的java.net类。当JavaMail&nbsp;API在Java&nbsp;1.1下工作时,JavaMail和java.net不会共享同一个Authenticator类名称,这是因为Java&nbsp;1.1中不含有java.net。<BR>要使用Authenticator类,您可以使用该抽象类的子类,并通过getPasswordAuthentication()方法返回一个PasswordAuthentication实例。在创建时,您必须用会话记录Authentication类。其后,当需要进行身份验证时,会通知您的Authenticator。会弹出一个窗口,或从一个配置文件(尽管不加密就不安全)中读取用户名和密码,并把它们作为一个PasswordAuthentication对象返回给调用程序。<BR>Properties&nbsp;props&nbsp;=&nbsp;new&nbsp;Properties();<BR>//&nbsp;fill&nbsp;props&nbsp;with&nbsp;any&nbsp;information<BR>Authenticator&nbsp;auth&nbsp;=&nbsp;new&nbsp;MyAuthenticator();<BR>Session&nbsp;session&nbsp;=&nbsp;Session.getDefaultInstance(props,&nbsp;auth);<BR>Transport类<BR>发送消息的最后一步操作是使用Transport类。该类使用特定于协议(通常是SMTP)的语言来发送消息。它是一个抽象类,其操作与Session类有些相似。您可以通过只调用静态的send()方法来使用该类的默认版本:<BR>Transport.send(message);<BR>或者,您可以从用于您的协议的会话中获取一个特定的实例,然后传递用户名和密码(不必要时可以为空)并发送消息,最后关闭连接:<BR>message.saveChanges();&nbsp;//&nbsp;implicit&nbsp;with&nbsp;send()<BR>Transport&nbsp;transport&nbsp;=&nbsp;session.getTransport("smtp");<BR>transport.connect(host,&nbsp;username,&nbsp;password);<BR>transport.sendMessage(message,&nbsp;message.getAllRecipients());<BR>transport.close();<BR>当您需要发送多个消息时,建议采用后一种方法,因为它将保持消息间活动服务器的连接。而基本的send()机制会为每一个方法调用都建立一条独立的连接。<BR>注意:要查看经过邮件服务器邮件命令,可以用session.setDebug(true)方法设置调试标志。<BR>Store和Folder类<BR>使用Session类来获取消息,开始时与发送消息很相似。但是,在获取会话后,很有可能使用用户名和密码或Authenticator类来连接Store类。与Transport类一样,您要告诉Store类将使用什么协议:<BR>//&nbsp;Store&nbsp;store&nbsp;=&nbsp;session.getStore("imap");<BR>Store&nbsp;store&nbsp;=&nbsp;session.getStore("pop3");<BR>store.connect(host,&nbsp;username,&nbsp;password);<BR>在连接Store类后,就可以获取一个Folder类,在读取其中的消息前必须先打开该类。<BR>Folder&nbsp;folder&nbsp;=&nbsp;store.getFolder("INBOX");<BR>folder.open(Folder.READ_ONLY);<BR>Message&nbsp;message[]&nbsp;=&nbsp;folder.getMessages();<BR>对于POP3协议,惟一可用的文件夹是INBOX。如果使用的是IMAP协议,则可以使用其他的文件夹。<BR>注意:Sun公司的提供程序本来想提供方便。而Message&nbsp;message[]=folder.getMessages();这条语句却是一种从服务器逐条读取消息的缓慢操作,所以仅当您确实需要获取消息部分(该内容是所检索消息的内容)时可以使用这条语句。<BR>一旦读取消息,就可以使用getContent()方法获取其内容,或使用writeTo()方法将其内容写到一个流中。getContent()方法只获取消息内容,而writeTo()方法则还会输出报头。<BR>System.out.println(((MimeMessage)message).getContent());<BR>一旦您阅读完邮件,就可以关闭对文件夹和存储的连接。<BR>folder.close(aBoolean);<BR>store.close();<BR>传递给文件夹的close()方法的布尔变量指定了是否通过清除已删除的消息来更新文件夹。<BR>继续前进<BR>实际上,理解使用这7个类的方式,是使用JavaMail&nbsp;API处理几乎所有事情所需要的全部内容。用这7个类以外的方式构建的JavaMail&nbsp;API,其大多数功能都是以几乎完全相同或特定的方式来执行任务的,就好像内容是附件。特定的任务,如:搜索、隔离等将在后面进行介绍。<BR>使用JavaMail&nbsp;API<BR>您已经看到了如何操作JavaMail&nbsp;API的核心部分。在下面几节中,您将学习如何连接几个部分以执行特定的任务。<BR>发送消息<BR>发送电子邮件消息涉及到获取会话、创建和填充消息并发送消息这些操作。您可以在获取Session时,通过为要传递的Properties对象设置mail.smtp.host属性来指定您的SMTP服务器。<BR>String&nbsp;host&nbsp;=&nbsp;...;<BR>String&nbsp;from&nbsp;=&nbsp;...;<BR>String&nbsp;to&nbsp;=&nbsp;...;<BR>//&nbsp;Get&nbsp;system&nbsp;properties<BR>Properties&nbsp;props&nbsp;=&nbsp;System.getProperties();<BR>//&nbsp;Setup&nbsp;mail&nbsp;server<BR>props.put("mail.smtp.host",&nbsp;host);<BR>//&nbsp;Get&nbsp;session<BR>Session&nbsp;session&nbsp;=&nbsp;Session.getDefaultInstance(props,&nbsp;null);<BR>//&nbsp;Define&nbsp;message<BR>MimeMessage&nbsp;message&nbsp;=&nbsp;new&nbsp;MimeMessage(session);<BR>message.setFrom(new&nbsp;InternetAddress(from));<BR>message.addRecipient(Message.RecipientType.TO,&nbsp;<BR>new&nbsp;InternetAddress(to));<BR>message.setSubject("Hello&nbsp;JavaMail");<BR>message.setText("Welcome&nbsp;to&nbsp;JavaMail");<BR>//&nbsp;Send&nbsp;message<BR>Transport.send(message);<BR>您应该在try-catch块中编写代码,以在创建消息并发送它时可以抛出一个异常。<BR>练习<BR>发送您的第一个消息<BR>获取消息<BR>对于阅读邮件来说,首先您要获取一个会话,然后获取并连接到一个相应的用于您的收件箱的存储上,接着打开相应的文件夹,再获取消息。同时,不要忘记了操作完成后关闭连接。<BR>String&nbsp;host&nbsp;=&nbsp;...;<BR>String&nbsp;username&nbsp;=&nbsp;...;<BR>String&nbsp;password&nbsp;=&nbsp;...;<BR>//&nbsp;Create&nbsp;empty&nbsp;properties<BR>Properties&nbsp;props&nbsp;=&nbsp;new&nbsp;Properties();<BR>//&nbsp;Get&nbsp;session<BR>Session&nbsp;session&nbsp;=&nbsp;Session.getDefaultInstance(props,&nbsp;null);<BR>//&nbsp;Get&nbsp;the&nbsp;store<BR>Store&nbsp;store&nbsp;=&nbsp;session.getStore("pop3");<BR>store.connect(host,&nbsp;username,&nbsp;password);<BR>//&nbsp;Get&nbsp;folder<BR>Folder&nbsp;folder&nbsp;=&nbsp;store.getFolder("INBOX");<BR>folder.open(Folder.READ_ONLY);<BR>//&nbsp;Get&nbsp;directory<BR>Message&nbsp;message[]&nbsp;=&nbsp;folder.getMessages();<BR>for&nbsp;(int&nbsp;i=0,&nbsp;n=message.length;&nbsp;i&lt;n;&nbsp;i++)&nbsp;{<BR>System.out.println(i&nbsp;+&nbsp;":&nbsp;"&nbsp;+&nbsp;message[i].getFrom()[0]&nbsp;<BR>+&nbsp;"\t"&nbsp;+&nbsp;message[i].getSubject());<BR>}<BR>//&nbsp;Close&nbsp;connection&nbsp;<BR>folder.close(false);<BR>store.close();<BR>每一条消息执行何种操作取决于自己决定。上面的代码块只是显示了消息的发送者和主题。从技术上讲,发送者地址列表可以为空,此时getFrom()[0]调用会抛出一个异常。<BR>为了显示整条消息,您可以提示用户在看完消息的发送者和主题字段后,如果想看到消息的内容,可以再调用消息的writeTo()方法。<BR>BufferedReader&nbsp;reader&nbsp;=&nbsp;new&nbsp;BufferedReader&nbsp;(<BR>new&nbsp;InputStreamReader(System.in));<BR>//&nbsp;Get&nbsp;directory<BR>Message&nbsp;message[]&nbsp;=&nbsp;folder.getMessages();<BR>for&nbsp;(int&nbsp;i=0,&nbsp;n=message.length;&nbsp;i&lt;n;&nbsp;i++)&nbsp;{<BR>System.out.println(i&nbsp;+&nbsp;":&nbsp;"&nbsp;+&nbsp;message[i].getFrom()[0]&nbsp;<BR>+&nbsp;"\t"&nbsp;+&nbsp;message[i].getSubject());<BR>System.out.println("Do&nbsp;you&nbsp;want&nbsp;to&nbsp;read&nbsp;message?&nbsp;"&nbsp;+<BR>"[YES&nbsp;to&nbsp;read/QUIT&nbsp;to&nbsp;end]");<BR>String&nbsp;line&nbsp;=&nbsp;reader.readLine();<BR>if&nbsp;("YES".equals(line))&nbsp;{<BR>message[i].writeTo(System.out);<BR>}&nbsp;else&nbsp;if&nbsp;("QUIT".equals(line))&nbsp;{<BR>break;<BR>}<BR>}<BR>练习<BR>检查邮件<BR>删除消息和标志<BR>删除消息涉及到操作与消息关联的标志。对不同的状态有不同的标志,有些标志是系统定义的,有些则是由用户定义的。预定义的标志都是在内部类Flags.Flag中定义的,如下所示:<BR>?&nbsp;Flags.Flag.ANSWERED&nbsp;<BR>?&nbsp;Flags.Flag.DELETED&nbsp;<BR>?&nbsp;Flags.Flag.DRAFT&nbsp;<BR>?&nbsp;Flags.Flag.FLAGGED&nbsp;<BR>?&nbsp;Flags.Flag.RECENT&nbsp;<BR>?&nbsp;Flags.Flag.SEEN&nbsp;<BR>?&nbsp;Flags.Flag.USER&nbsp;<BR>仅仅因为标志存在,并不表示标志为所有的邮件服务器/提供程序所支持。例如,除了删除消息外,POP协议对它们都不支持。检查新邮件不是POP的任务,但它已内置到邮件客户程序中。要搞清楚什么标志受到支持,可以使用getPermanentFlags()方法来询问文件夹。<BR>要删除消息,需要为消息设置DELETE标志:<BR>message.setFlag(Flags.Flag.DELETED,&nbsp;true);<BR>第一次以READ_WRITE(读-写)模式打开文件夹:<BR>folder.open(Folder.READ_WRITE);<BR>然后,处理完了所有的消息,请关闭文件夹,并传递true值以擦去删除的消息。<BR>folder.close(true);<BR>用户可使用Folder类的expunge()方法来删除消息。但是,该方法对Sun公司的POP3提供程序不起作用。其他提供程序或许能也或许不能实现其功能。它更有可能适用于IMAP提供程序。由于POP只支持对收件箱的简单访问,使用Sun公司的提供程序时,您将不得不关闭文件夹以删除消息。<BR>要移去标志,只需传递一个false值给setFlag()方法。要看看是否设置了某个标志,可以使用isSet()进行检查。<BR>自我验证<BR>先前学到的是使用Authenticator类,以在需要时提示输入用户名和密码,而不是以字符串的形式传入它们。这里,您将真正看到如何更加充分地使用验证。<BR>不需使用主机、用户名和密码连接到Store,您可以配置Properties带有主机,并告诉Session关于您自定义的Authenticator实例,如下所示:<BR>//&nbsp;Setup&nbsp;properties<BR>Properties&nbsp;props&nbsp;=&nbsp;System.getProperties();<BR>props.put("mail.pop3.host",&nbsp;host);<BR>//&nbsp;Setup&nbsp;authentication,&nbsp;get&nbsp;session<BR>Authenticator&nbsp;auth&nbsp;=&nbsp;new&nbsp;PopupAuthenticator();<BR>Session&nbsp;session&nbsp;=&nbsp;Session.getDefaultInstance(props,&nbsp;auth);<BR>//&nbsp;Get&nbsp;the&nbsp;store<BR>Store&nbsp;store&nbsp;=&nbsp;session.getStore("pop3");<BR>store.connect();<BR>然后您可以使用Authenticator类的子类,并通过getPasswordAuthentication()方法返回一个PasswordAuthentication对象。下面是这种实现的一个例子,其中一个字段同时适用于两部分内容。它不是一个Project&nbsp;Swing指南,只是在一个字段中输入了两部分内容,它们是用逗号隔开的。<BR>import&nbsp;javax.mail.*;<BR>import&nbsp;javax.swing.*;<BR>import&nbsp;java.util.*;<BR>public&nbsp;class&nbsp;PopupAuthenticator&nbsp;extends&nbsp;Authenticator&nbsp;{<BR>public&nbsp;PasswordAuthentication&nbsp;getPasswordAuthentication()&nbsp;{<BR>String&nbsp;username,&nbsp;password;<BR>String&nbsp;result&nbsp;=&nbsp;JOptionPane.showInputDialog(<BR>"Enter&nbsp;'username,password'");<BR>StringTokenizer&nbsp;st&nbsp;=&nbsp;new&nbsp;StringTokenizer(result,&nbsp;",");<BR>username&nbsp;=&nbsp;st.nextToken();<BR>password&nbsp;=&nbsp;st.nextToken();<BR>return&nbsp;new&nbsp;PasswordAuthentication(username,&nbsp;password);<BR>}<BR>}<BR>由于PopupAuthenticator依赖于Swing,因而将会启动用于AWT的事件处理线程。这在本质上要求您在代码中添加一个对System.exit()的调用,以终止程序的执行。<BR>回复消息<BR>Message类包含一个reply()方法,以用正确的接收者和主题(添加“Re::”,如果没有的话)配置一条新消息。该方法不会为消息添加任何内容,只是为新的接收者复制发送者或回复到的报头。该方法使用一个布尔型参数,提示是否只回复给发送者(false)或回复给所有人(true)。<BR>MimeMessage&nbsp;reply&nbsp;=&nbsp;(MimeMessage)message.reply(false);<BR>reply.setFrom(new&nbsp;InternetAddress("president@whitehouse.gov"));<BR>reply.setText("Thanks");<BR>Transport.send(reply);<BR>在发送消息时要配置回复到地址,可使用setReplyTo()方法。<BR>练习<BR>回复邮件<BR>转发消息<BR>转发消息涉及的内容要稍微多一点,没有一个专门用于转发消息的方法,您可以通过处理组成消息的各个部分来创建要转发的消息。<BR>一条邮件消息可由多个部分组成,每一部分是一个BodyPart(报文部分),或更特殊一点,在操作MIME消息时则是MimeBodyPart。不同的报文部分组合到一个称为Multipart的容器中,或者又更特殊一点,是一个MimeMultipart容器。要转发消息,您要创建一个用于消息文本的部分,和用于要转发的消息的第二个部分,并将这两个部分组合成一个multipart(多个部分)。然后您可以把这个multipart添加到一个合适的注明地址的消息中并发送它。<BR>这就是转发消息的本质。要把一条消息的内容复制给另一条消息,只需通过它的DataHandler类复制即可,它是出自于JavaBeans&nbsp;Activation&nbsp;Framework的一个类。<BR>//&nbsp;Create&nbsp;the&nbsp;message&nbsp;to&nbsp;forward<BR>Message&nbsp;forward&nbsp;=&nbsp;new&nbsp;MimeMessage(session);<BR>//&nbsp;Fill&nbsp;in&nbsp;header<BR>forward.setSubject("Fwd:&nbsp;"&nbsp;+&nbsp;message.getSubject());<BR>forward.setFrom(new&nbsp;InternetAddress(from));<BR>forward.addRecipient(Message.RecipientType.TO,&nbsp;<BR>new&nbsp;InternetAddress(to));<BR>//&nbsp;Create&nbsp;your&nbsp;new&nbsp;message&nbsp;part<BR>BodyPart&nbsp;messageBodyPart&nbsp;=&nbsp;new&nbsp;MimeBodyPart();<BR>messageBodyPart.setText(<BR>"Here&nbsp;you&nbsp;go&nbsp;with&nbsp;the&nbsp;original&nbsp;message:\n\n");<BR>//&nbsp;Create&nbsp;a&nbsp;multi-part&nbsp;to&nbsp;combine&nbsp;the&nbsp;parts<BR>Multipart&nbsp;multipart&nbsp;=&nbsp;new&nbsp;MimeMultipart();<BR>multipart.addBodyPart(messageBodyPart);<BR>//&nbsp;Create&nbsp;and&nbsp;fill&nbsp;part&nbsp;for&nbsp;the&nbsp;forwarded&nbsp;content<BR>messageBodyPart&nbsp;=&nbsp;new&nbsp;MimeBodyPart();<BR>messageBodyPart.setDataHandler(message.getDataHandler());<BR>//&nbsp;Add&nbsp;part&nbsp;to&nbsp;multi&nbsp;part<BR>multipart.addBodyPart(messageBodyPart);<BR>//&nbsp;Associate&nbsp;multi-part&nbsp;with&nbsp;message<BR>forward.setContent(multipart);<BR>//&nbsp;Send&nbsp;message<BR>Transport.send(forward);<BR>操作附件<BR>附件是与邮件消息关联的资源,通常保存在消息之外,如:一个文本文件,电子表格或图片。对于像Eudora和Pine之类的常用邮件程序,您可以通过JavaMail&nbsp;API把资源附加到邮件消息上,并在您接收消息时获取附件。<BR>发送附件<BR>发送附件与转发消息非常相似,您要创建组成完整消息的各个部分。在创建好第一个部分即消息文本之后,您添加的用DataHandler类处理的其他部分就是您的附件,而不是转发消息中的共享处理程序。当您从一个文件读取附件时,附件的数据资源是FileDataSource;从URL读取时,则是URLDataSource。一旦您有了自己的DataSource,在将其通过setDataHandler()方法最终附加到BodyPart上之前,只需将其传递给DataHandler类的构造器即可。假定您想保留附件的原始文件名,要做的最后一件事就是用BodyPart类的setFileName()方法设置与附件关联的文件名。所有这些操作如下所示:<BR>//&nbsp;Define&nbsp;message<BR>Message&nbsp;message&nbsp;=&nbsp;new&nbsp;MimeMessage(session);<BR>message.setFrom(new&nbsp;InternetAddress(from));<BR>message.addRecipient(Message.RecipientType.TO,&nbsp;<BR>new&nbsp;InternetAddress(to));<BR>message.setSubject("Hello&nbsp;JavaMail&nbsp;Attachment");<BR>//&nbsp;Create&nbsp;the&nbsp;message&nbsp;part&nbsp;<BR>BodyPart&nbsp;messageBodyPart&nbsp;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -