﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-study-随笔分类-JavaMail</title><link>http://www.blogjava.net/xixidabao/category/15373.html</link><description>GROW WITH JAVA</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 10:20:03 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 10:20:03 GMT</pubDate><ttl>60</ttl><item><title>J2EE: 用Javamail发送邮件(转贴)</title><link>http://www.blogjava.net/xixidabao/archive/2006/09/19/70504.html</link><dc:creator>JAVA之路</dc:creator><author>JAVA之路</author><pubDate>Tue, 19 Sep 2006 05:06:00 GMT</pubDate><guid>http://www.blogjava.net/xixidabao/archive/2006/09/19/70504.html</guid><description><![CDATA[
		<p>/*<br />在java版经常看到有人问如何用javamail发送邮件？如何接收邮件？如何访问多个文件夹等。问题零散，而历史的回复早已经淹没在问题的海洋之中。</p>
		<p>本人之前所做过一个java项目，其中包含有WebMail功能，当初为用java实现而对javamail摸索了一段时间，总算有点收获。看到论坛中的经常有此方面的问题，因此把我的一些经验帖出来，希望对大家有些帮助。</p>
		<p>此篇仅介绍用javamail实现发送邮件功能，其中涉及smtp认证，邮件附件发送，及HTML内容邮件等。<br />其它有关多邮箱的实现，接收POP3邮件及IMAP等内容，将在后续文章中介绍。</p>
		<p>如下程序需要：javamail，JAF包，j2ee.jar包含了上述两个包，建议大家安装J2SDKEE或直接拷贝j2ee.jar，将其添加到jbuilder的library中，或系统ClassPath中</p>
		<p>*/</p>
		<p> </p>
		<p>package com.me.util.mail;</p>
		<p>/**<br /> * @author Zhangkun <a href="mailto:aistill@msn.com"><font color="#000080">aistill@msn.com</font></a><br /> * @version 1.0<br /> */</p>
		<p>import java.util.*;<br />import javax.mail.*;<br />import javax.mail.internet.*;<br />import java.util.Date;<br />import javax.activation.*;<br />import java.io.*;<br />import com.me.util.*;</p>
		<p>public class sendMail {</p>
		<p>  private MimeMessage mimeMsg;  //MIME邮件对象</p>
		<p>  private Session session;      //邮件会话对象<br />  private Properties props;     //系统属性<br />  private boolean needAuth = false;  //smtp是否需要认证</p>
		<p>  private String username = "";  //smtp认证用户名和密码<br />  private String password = "";</p>
		<p>  private Multipart mp;    //Multipart对象,邮件内容,标题,附件等内容均添加到其中后再生成MimeMessage对象</p>
		<p> </p>
		<p> /**<br />  * <br />  */<br />  public sendMail() {<br />    setSmtpHost(getConfig.mailHost);//如果没有指定邮件服务器,就从getConfig类中获取<br />    createMimeMessage();<br />  }</p>
		<p>  public sendMail(String smtp){<br />    setSmtpHost(smtp);<br />    createMimeMessage();<br />  }</p>
		<p> </p>
		<p> /**<br />  * @param hostName String<br />  */<br />  public void setSmtpHost(String hostName) {<br />    System.out.println("设置系统属性：mail.smtp.host = "+hostName);<br />    if(props == null)props = System.getProperties();         //获得系统属性对象</p>
		<p>    props.put("mail.smtp.host",hostName);                 //设置SMTP主机<br />  }</p>
		<p>
				<br /> /**<br />  * @return boolean<br />  */<br />  public boolean createMimeMessage()<br />  {<br />    try{<br />      System.out.println("准备获取邮件会话对象！";<br />      session = Session.getDefaultInstance(props,null);   //获得邮件会话对象<br />    }<br />    catch(Exception e){<br />      System.err.println("获取邮件会话对象时发生错误！"+e);<br />      return false;<br />    }</p>
		<p>    System.out.println("准备创建MIME邮件对象！";<br />    try{<br />      mimeMsg = new MimeMessage(session);                 //创建MIME邮件对象<br />      mp = new MimeMultipart();</p>
		<p>      return true;<br />    }<br />    catch(Exception e){<br />      System.err.println("创建MIME邮件对象失败！"+e);<br />      return false;<br />    }<br />  }</p>
		<p> </p>
		<p> /**<br />  * @param need boolean<br />  */<br />  public void setNeedAuth(boolean need) {<br />    System.out.println("设置smtp身份认证：mail.smtp.auth = "+need);<br />    if(props == null)props = System.getProperties();</p>
		<p>    if(need){<br />      props.put("mail.smtp.auth","true";<br />    }else{<br />      props.put("mail.smtp.auth","false";<br />    }<br />  }</p>
		<p> </p>
		<p> /**<br />  * @param name String<br />  * @param pass String<br />  */<br />  public void setNamePass(String name,String pass) {<br />    username = name;<br />    password = pass;<br />  }</p>
		<p>
				<br /> /**<br />  * @param mailSubject String<br />  * @return boolean<br />  */<br />  public boolean setSubject(String mailSubject) {<br />    System.out.println("设置邮件主题！";<br />    try{<br />      mimeMsg.setSubject(mailSubject);<br />      return true;<br />    }<br />    catch(Exception e) {<br />      System.err.println("设置邮件主题发生错误！";<br />      return false;<br />    }<br />  }</p>
		<p>
				<br /> <br /> /**<br />  * @param mailBody String<br />  */<br />  public boolean setBody(String mailBody) {<br />    try{<br />      BodyPart bp = new MimeBodyPart();<br />      bp.setContent("&lt;meta http-equiv=Content-Type content=text/html; charset=gb2312&gt;"+mailBody,"text/html;charset=GB2312";<br />      mp.addBodyPart(bp);</p>
		<p>      return true;<br />    }<br />    catch(Exception e){<br />      System.err.println("设置邮件正文时发生错误！"+e);<br />      return false;<br />    }<br />  }</p>
		<p>
				<br /> /**<br />  * @param name String<br />  * @param pass String<br />  */<br />  public boolean addFileAffix(String filename) {</p>
		<p> System.out.println("增加邮件附件："+filename);</p>
		<p> try{<br />      BodyPart bp = new MimeBodyPart();<br />      FileDataSource fileds = new FileDataSource(filename);<br />      bp.setDataHandler(new DataHandler(fileds));<br />      bp.setFileName(fileds.getName());</p>
		<p>      mp.addBodyPart(bp);</p>
		<p>      return true;<br />    }<br />    catch(Exception e){<br />      System.err.println("增加邮件附件："+filename+"发生错误！"+e);<br />      return false;<br />    }<br />  }</p>
		<p> </p>
		<p> /**<br />  * @param name String<br />  * @param pass String<br />  */<br />  public boolean setFrom(String from) {<br />    System.out.println("设置发信人！";<br />    try{<br />      mimeMsg.setFrom(new InternetAddress(from));             //设置发信人<br />      return true;<br />    }<br />    catch(Exception e)<br />    { return false; }<br />  }</p>
		<p>
				<br /> /**<br />  * @param name String<br />  * @param pass String<br />  */<br />  public boolean setTo(String to){<br />    if(to == null)return false;</p>
		<p>    try{<br />      mimeMsg.setRecipients(Message.RecipientType.TO,InternetAddress.parse(to));<br />      return true;<br />    }<br />    catch(Exception e)<br />    {   return false;   }</p>
		<p>  }</p>
		<p> /**<br />  * @param name String<br />  * @param pass String<br />  */<br />  public boolean setCopyTo(String copyto)<br />  {<br />    if(copyto == null)return false;<br />    try{<br />      mimeMsg.setRecipients(Message.RecipientType.CC,(Address[])InternetAddress.parse(copyto));<br />      return true;<br />    }<br />    catch(Exception e)<br />    { return false; }<br />  }</p>
		<p>
				<br /> /**<br />  * @param name String<br />  * @param pass String<br />  */<br />  public boolean sendout()<br />  {<br />    try{<br />      mimeMsg.setContent(mp);<br />      mimeMsg.saveChanges();<br />      System.out.println("正在发送邮件....";</p>
		<p>      Session mailSession = Session.getInstance(props,null);<br />      Transport transport = mailSession.getTransport("smtp";<br />      transport.connect((String)props.get("mail.smtp.host",username,password);<br />      transport.sendMessage(mimeMsg,mimeMsg.getRecipients(Message.RecipientType.TO));<br />      //transport.send(mimeMsg);</p>
		<p>      System.out.println("发送邮件成功！";<br />      transport.close();</p>
		<p>      return true;<br />    }<br />    catch(Exception e)<br />    {<br />      System.err.println("邮件发送失败！"+e);<br />      return false;<br />    }<br />  }</p>
		<p>
				<br />  /**<br />   *  Just do it as this<br />   */<br />  public static void main(String[] args) {</p>
		<p>    String mailbody = "&lt;meta http-equiv=Content-Type content=text/html; charset=gb2312&gt;"+<br />        "&lt;div align=center&gt;&lt;a href=http://www.csdn.net&gt; csdn &lt;/a&gt;&lt;/div&gt;";</p>
		<p>    sendMail themail = new sendMail("smtp.msn.com";<br />    themail.setNeedAuth(true);</p>
		<p>    if(themail.setSubject("标题" == false) return;<br />    if(themail.setBody(mailbody) == false) return;<br />    if(themail.setTo("<a href="mailto:gates@msn.com"><font color="#000080">gates@msn.com</font></a>" == false) return;<br />    if(themail.setFrom("<a href="mailto:bill@msn.com"><font color="#000080">bill@msn.com</font></a>" == false) return;<br />    if(themail.addFileAffix("c:\\boot.ini" == false) return;<br />    themail.setNamePass("user","password";</p>
		<p>    if(themail.sendout() == false) return;    <br />  }<br />}</p>
<img src ="http://www.blogjava.net/xixidabao/aggbug/70504.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixidabao/" target="_blank">JAVA之路</a> 2006-09-19 13:06 <a href="http://www.blogjava.net/xixidabao/archive/2006/09/19/70504.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaMail实例详解</title><link>http://www.blogjava.net/xixidabao/archive/2006/09/19/70502.html</link><dc:creator>JAVA之路</dc:creator><author>JAVA之路</author><pubDate>Tue, 19 Sep 2006 05:03:00 GMT</pubDate><guid>http://www.blogjava.net/xixidabao/archive/2006/09/19/70502.html</guid><description><![CDATA[
		<p>Java Mail API的开发是SUN为Java开发者提供公用API框架的持续努力的良好例证。提倡公用框架，反对受限于供应商的解决方案，<br />充分预示着一个日益开放的开发环境的建立。Java Mail API的结构本身证明了它的开发者的基本目标之一<br />--软件开发的工作量应该取决于应用程序本身的复杂程度以及开发者所要求的控制程度。<br />换句话说，Java Mail API尽可能地保持简单。乍看起来，Java Mail API所拥有的类总数以及类之间的关系可能让人误解为要花费漫长<br />的学习时间。实际上，一旦正式开始使用，你就会发现该API不失为在应用程序中加入健壮的邮件/通讯支持的简单工具</p>
		<p>该实例是一个发送电子邮件的简单实例，由一个填写邮件内容的HTML页面index.html。和负责发送邮件的JSP页面构成。对于初学者有<br />很好的借鉴作用,内附有详细的注解</p>
		<p>一、index.html<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;<br />&lt;title&gt;填写邮件信息&lt;/title&gt;<br />&lt;LINK REL="stylesheet" HREF="E:\tomcat 4.1.12\webapps\qds\css.css" TYPE="text/css"&gt;<br />&lt;/head&gt;</p>
		<p>&lt;body bgcolor="#FFFFCC"&gt;<br />&lt;form name="form1" method="post" action="SendMail.jsp"&gt;<br />&lt;table width="75" border="0" align="center" cellspacing="1" bgcolor="#006600" height="258"&gt;</p>
		<p>&lt;div align="center"&gt;</p>
		<p>&lt;font size="5" color="blue"&gt;填写邮件信息&lt;/font&gt;<br />&lt;tr bgcolor="#FFFFFF"&gt; <br />&lt;td width="30%" height="34"&gt;发件人地址:&lt;/td&gt;<br />&lt;td width="70%" height="34"&gt; <br />&lt;input name="from" type="text" id="from" CLASS="kuang-bg"&gt;&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;tr bgcolor="#FFFFFF"&gt; <br />&lt;td width="30%" height="34"&gt;收信人地址:&lt;/td&gt;<br />&lt;td width="70%" height="34"&gt; <br />&lt;input name="to" type="text" id="to" CLASS="kuang-bg"&gt;&lt;/td&gt;<br />&lt;/tr&gt;</p>
		<p>&lt;tr bgcolor="#FFFFFF"&gt; <br />&lt;td width="30%" height="25"&gt;主题:&lt;/td&gt;<br />&lt;td width="70%" height="25"&gt; <br />&lt;input name="title" type="text" id="title" CLASS="kuang-bg"&gt;&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;tr&gt; <br />&lt;td height="119" colspan="2" bgcolor="#FFFFFF"&gt; <br />&lt;textarea name="content" cols="50" rows="5" id="content" CLASS="kuang-bg"&gt;&lt;/textarea&gt;&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;tr align="center"&gt; <br />&lt;td colspan="2" bgcolor="#FFFFFF" height="27"&gt; <br />&lt;input type="submit" name="Submit" value="发  送" CLASS="botton"&gt;<br />&lt;input type="reset" name="Submit2" value="重  写" CLASS="botton"&gt;<br />&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;/table&gt;<br />&lt;/form&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;</p>
		<p>
				<br />二、sendMail.jsp<br />&lt;%@ page contentType="text/html;charset=GB2312" %&gt;<br />&lt;!--%request.setCharacterEncoding("gb2312");%--&gt;&lt;!--中文处理代码--&gt;<br />&lt;!--导入要用到的类库--&gt;<br />&lt;%@ page import="java.util.*"%&gt;<br />&lt;%@ page import="javax.mail.*"%&gt;<br />&lt;%@ page import="javax.mail.internet.*"%&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;<br />&lt;title&gt;发送邮件&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;body&gt;</p>
		<p>&lt;%<br />try{<br />//从html表单中获取邮件信息<br />String tfrom=request.getParameter("from");<br />String tto=request.getParameter("to");<br />String ttitle=request.getParameter("title");<br />String tcontent=request.getParameter("content");</p>
		<p>//JavaMail需要Properties来创建一个session对象。它将寻找字符串"mail.smtp.host"，属性值就是发送邮件的主机.<br />//Properties对象获取诸如邮件服务器、用户名、密码等信息，以及其他可在整个应用程序中 共享的信息。</p>
		<p>Properties props=new Properties();//也可用Properties props = System.getProperties();<br />props.put("mail.smtp.host","smtp.21cn.com");//存储发送邮件服务器的信息<br />props.put("mail.smtp.auth","true");//同时通过验证</p>
		<p>//方法二：(如果是在weblogin配置JavaMail：则需指定JNDI名检索<br />//Context ctx=new InitialContext();<br />//Session s=(Session)ctx.lookup("MailSession");<br />//Message msg=new MimeMessage(s);</p>
		<p>
				<br />//这个Session类代表JavaMail 中的一个邮件session. 每一个基于 JavaMail的应用程序至少有一个session但是可以有任意多的session。<br />//Session类定义全局和每个用户的与邮件相关的属性。这此属性说明了客房机和服务器如何交流信息。</p>
		<p>
				<br />Session s=Session.getInstance(props,null);//根据属性新建一个邮件会话，null参数是一种Authenticator(验证程序) 对象<br />s.setDebug(true);//设置调试标志,要查看经过邮件服务器邮件命令，可以用该方法</p>
		<p>//  一旦创建了自己的Session对象，就是该去创建要发送的消息的 时候了。这时就要用到消息类型(MimeMessage是其中一种类型)。<br />//　Message对象将存储我们实际发送的电子邮件信息，Message对象被作为一个MimeMessage对象来创建并且需要知道应当选择哪一个JavaMail session。<br />//  Message类表示单个邮件消息，它的属性包括类型，地址信息和所定义的目录结构。</p>
		<p>Message message=new MimeMessage(s);//由邮件会话新建一个消息对象</p>
		<p>//message.setContent("hello","test/plain");//设置消息的内容类型,如果发送的格式有HTML格式就必须设置，<br />//message.setText("Hello");//发送一般文本格式的消息</p>
		<p>//设置邮件,一旦您创建了 Session 和 Message，并将内容填入消息后，就可以用Address确定信件地址了。<br />//如果想让一个名字出现在电子邮件地址后，也可以将其传递给构造器：<br />//Address from=new InternetAddress("<a href="http://blog.csdn.net/xmqds/archive/2004/07/02/'mailto:xmqds@21cn.com" ,?qdison?);="" ??=""><font color="#000080">xmqds@21cn.com","qdison");//</font></a>发件人的邮件地址</p>
		<p>Address from=new InternetAddress(tfrom);//发件人的邮件地址<br />message.setFrom(from);//设置发件人</p>
		<p>Address to=new InternetAddress(tto);//收件人的邮件地址<br />message.setRecipient(Message.RecipientType.TO,to);//设置收件人,并设置其接收类型为TO,还有3种预定义类型如下：</p>
		<p>//Message.RecipientType.TO <br />//Message.RecipientType.CC <br />//Message.RecipientType.BCC </p>
		<p>message.setSubject(ttitle);//设置主题<br />message.setText(tcontent);//设置信件内容<br />message.setSentDate(new Date());//设置发信时间</p>
		<p>
				<br />message.saveChanges();//存储邮件信息</p>
		<p>
				<br />// Transport 是用来发送信息的，<br />// 用于邮件的收发打操作。<br />Transport transport=s.getTransport("smtp");<br />transport.connect("smtp.21cn.com","你的用户名","你的密码");//以smtp方式登录邮箱<br />transport.sendMessage(message,message.getAllRecipients());//发送邮件,其中第二个参数是所有已设好的收件人地址<br />transport.close();</p>
		<p>%&gt;<br />&lt;div align="center"&gt;<br />&lt;p&gt;&lt;font color="#FF6600"&gt;发送成功!&lt;/font&gt;&lt;/p&gt;<br />&lt;p&gt;&lt;a href="index.jsp"&gt;再发一封&lt;/a&gt; &lt;/p&gt;<br />&lt;/div&gt;<br />&lt;%<br />}catch(MessagingException e){<br />out.println(e.toString());<br />}<br />%&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;</p>
<img src ="http://www.blogjava.net/xixidabao/aggbug/70502.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixidabao/" target="_blank">JAVA之路</a> 2006-09-19 13:03 <a href="http://www.blogjava.net/xixidabao/archive/2006/09/19/70502.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaMail API详解</title><link>http://www.blogjava.net/xixidabao/archive/2006/09/19/70501.html</link><dc:creator>JAVA之路</dc:creator><author>JAVA之路</author><pubDate>Tue, 19 Sep 2006 05:01:00 GMT</pubDate><guid>http://www.blogjava.net/xixidabao/archive/2006/09/19/70501.html</guid><description><![CDATA[
		<p>JavaMail API详解</p>
		<p>
				<span style="COLOR: red">版权声明：本文可以自由转载，转载时请务必以超链接形式标明文章原始出处和作者信息及本声明</span>
				<br />作者:cleverpig(作者的Blog:<a href="http://blog.matrix.org.cn/page/cleverpig" target="_new"><font color="#002c99">http://blog.matrix.org.cn/page/cleverpig</font></a>)<br />原文:<a href="http://www.matrix.org.cn/resource/article/44/44101_JavaMail.html" target="_new"><font color="#002c99">http://www.matrix.org.cn/resource/article/44/44101_JavaMail.html</font></a><br />关键字:java,mail,pop,smtp<br /><br /><span style="COLOR: blue">一、JavaMail API简介</span><br />JavaMail API是读取、撰写、发送电子信息的可选包。我们可用它来建立如Eudora、Foxmail、MS Outlook Express一般的邮件用户代理程序（Mail User Agent,简称MUA）。而不是像sendmail或者其它的邮件传输代理（Mail Transfer Agent，简称MTA）程序那样可以传送、递送、转发邮件。从另外一个角度来看，我们这些电子邮件用户日常用MUA程序来读写邮件，而MUA依赖着MTA处理邮件的递送。<br />在清楚了到MUA与MTA之间的关系后，让我们看看JavaMail API是如何提供信息访问功能的吧！JavaMail API被设计用于以不依赖协议的方式去发送和接收电子信息，这个API被分为两大部分：<br /><br />基本功能：如何以不依赖于协议的方式发送接收电子信息，这也是本文所要描述的，不过在下文中，大家将看到这只是一厢情愿而已。<br />第二个部分则是依赖特定协议的，比如SMTP、POP、IMAP、NNTP协议。在这部分的JavaMail API是为了和服务器通讯，并不在本文的内容中。<br /><br /><span style="COLOR: blue">二、相关协议一览</span><br />在我们步入JavaMail API之前，先看一下API所涉及的协议。以下便是大家日常所知、所乐于使用的4大信息传输协议：<br />SMTP<br />POP<br />IMAP<br />MIME<br />当然，上面的4个协议，并不是全部，还有NNTP和其它一些协议可用于传输信息，但是由于不常用到，所以本文便不提及了。理解这4个基本的协议有助于我们更好的使用JavaMail API。然而JavaMail API是被设计为与协议无关的，目前我们并不能克服这些协议的束缚。确切的说，如果我们使用的功能并不被我们选择的协议支持，那么JavaMail API并不可能如魔术师一样神奇的赋予我们这种能力。<br /><br /><span style="COLOR: blue">1．SMTP</span><br />简单邮件传输协议定义了递送邮件的机制。在下文中，我们将使用基于Java-Mail的程序与公司或者ISP的SMTP服务器进行通讯。这个SMTP服务器将邮件转发到接收者的SMTP服务器，直至最后被接收者通过POP或者IMAP协议获取。这并不需要SMTP服务器使用支持授权的邮件转发，但是却的确要注意SMTP服务器的正确设置（SMTP服务器的设置与JavaMail API无关）。<br /><br /><span style="COLOR: blue">2．POP</span><br />POP是一种邮局协议，目前为第3个版本，即众所周知的POP3。POP定义了一种用户如何获得邮件的机制。它规定了每个用户使用一个单独的邮箱。大多数人在使用POP时所熟悉的功能并非都被支持，例如查看邮箱中的新邮件数量。而这个功能是微软的Outlook内建的，那么就说明微软Outlook之类的邮件客户端软件是通过查询最近收到的邮件来计算新邮件的数量来实现前面所说的功能。因此在我们使用JavaMail API时需要注意，当需要获得如前面所讲的新邮件数量之类的信息时，我们不得不自己进行计算。<br /><br /><span style="COLOR: blue">3．IMAP</span><br />IMAP使用在接收信息的高级协议，目前版本为第4版，所以也被称为IMAP4。需要注意的是在使用IMAP时，邮件服务器必须支持该协议。从这个方面讲，我们并不能完全使用IMAP来替代POP，不能期待IMAP在任何地方都被支持。假如邮件服务器支持IMAP，那么我们的邮件程序将能够具有以下被IMAP所支持的特性：每个用户在服务器上可具有多个目录，这些目录能在多个用户之间共享。<br />其与POP相比高级之处显而易见，但是在尝试采取IMAP时，我们认识到它并不是十分完美的：由于IMAP需要从其它服务器上接收新信息，将这些信息递送给用户，维护每个用户的多个目录，这都为邮件服务器带来了高负载。并且IMAP与POP的一个不同之处是POP用户在接收邮件时将从邮件服务器上下载邮件，而IMAP允许用户直接访问邮件目录，所以在邮件服务器进行备份作业时，由于每个长期使用此邮件系统的用户所用的邮件目录会占有很大的空间，这将直接导致邮件服务器上磁盘空间暴涨。<br /><br /><span style="COLOR: blue">4．MIME</span><br />MIME并不是用于传送邮件的协议，它作为多用途邮件的扩展定义了邮件内容的格式：信息格式、附件格式等等。一些RFC标准都涉及了MIME：RFC 822, RFC 2045, RFC 2046, RFC 2047，有兴趣的Matrixer可以阅读一下。而作为JavaMail API的开发者，我们并不需关心这些格式定义，但是这些格式被用在了程序中。<br /><br /><span style="COLOR: blue">5．NNTP和其它的第三方协议</span><br />正因为JavaMail API在设计时考虑到与第三方协议实现提供商之间的分离，故我们可以很容易的添加一些第三方协议。SUN维护着一个第三方协议实现提供商的列表：<a href="http://java.sun.com/products/javamail/Third_Party.html" target="_new"><font color="#002c99">http://java.sun.com/products/javamail/Third_Party.html</font></a>，通过此列表我们可以找到所需要的而又不被SUN提供支持的第三方协议：比如NNTP这个新闻组协议和S/MIME这个安全的MIME协议。<br /><br /><span style="COLOR: blue">三、安装</span><br /><span style="COLOR: blue">1．安装JavaMail</span><br />为了使用JavaMail API，需要从<a href="ttp://java.sun.com/products/javamail/downloads/index.html" target="_new"><font color="#002c99">http://java.sun.com/products/javamail/downloads/index.html</font></a>下载文件名格式为javamail-[version].zip的文件（这个文件中包括了JavaMail实现），并将其中的mail.jar文件添加到CLASSPATH中。这个实现提供了对SMTP、IMAP4、POP3的支持。<br />注意：在安装JavaMail实现之后，我们将在demo目录中发现许多有趣的简单实例程序。<br />在安装了JavaMail之后,我们还需要安装JavaBeans Activation Framework，因为这个框架是JavaMail API所需要的。如果我们使用J2EE的话，那么我们并无需单独下载JavaMail，因为它存在于J2EE.jar中，只需将J2EE.jar加入到CLASSPATH即可。<br /><br /><span style="COLOR: blue">2．安装JavaBeans Activation Framework</span><br />从<a href="http://java.sun.com/products/javabeans/glasgow/jaf.html" target="_new"><font color="#002c99">http://java.sun.com/products/javabeans/glasgow/jaf.html</font></a>下载JavaBeans Activation Framework，并将其添加到CLASSPATH中。此框架增加了对任何数据块的分类、以及对它们的处理的特性。这些特性是JavaMail API需要的。虽然听起来这些特性非常模糊，但是它对于我们的JavaMail API来说只是提供了基本的MIME类型支持。<br />到此为止，我们应当把mail.jar和activation.jar都添加到了CLASSPATH中。<br />当然如果从方便的角度讲，直接把这两个Jar文件复制到JRE目录的lib/ext目录中也可以。<br /><br /><span style="COLOR: blue">四、初次认识JavaMail API</span><br /><span style="COLOR: blue">1．了解我们的JavaMail环境</span><br /><span style="COLOR: green">A．纵览JavaMail核心类结构</span><br />打开JavaMail.jar文件，我们将发现在javax.mail的包下面存在着一些核心类：Session、Message、Address、Authenticator、Transport、Store、Folder。而且在javax.mail.internet包中还有一些常用的子类。<br /><span style="COLOR: green">B．Session</span><br />Session类定义了基本的邮件会话。就像Http会话那样，我们进行收发邮件的工作都是基于这个会话的。Session对象利用了java.util.Properties对象获得了邮件服务器、用户名、密码信息和整个应用程序都要使用到的共享信息。<br />Session类的构造方法是私有的，所以我们可以使用Session类提供的getDefaultInstance()这个静态工厂方法获得一个默认的Session对象：<br /></p>
		<pre class="overflow">
				<br />Properties props = new Properties();<br />// fill props with any information<br />Session session = Session.getDefaultInstance(props, null);<br /></pre>
		<p>
				<br />或者使用getInstance()这个静态工厂方法获得自定义的Session: <br /></p>
		<pre class="overflow">
				<br />Properties props = new Properties();<br />// fill props with any information<br />Session session = Session.getInstance(props, null);<br /></pre>
		<p>
				<br />从上面的两个例子中不难发现，getDefaultInstance()和getInstance()方法的第二个参数都是null，这是因为在上面的例子中并没有使用到邮件授权，下文中将对授权进行详细介绍。<br />从很多的实例看，在对mail server进行访问的过程中使用共享的Session是足够的，即使是工作在多个用户邮箱的模式下也不例外。<br /><br /><span style="COLOR: green">C．Message</span><br />当我们建立了Session对象后，便可以被发送的构造信息体了。在这里SUN提供了Message类型来帮助开发者完成这项工作。由于Message是一个抽象类，大多数情况下，我们使用javax.mail.internet.MimeMessage这个子类，该类是使用MIME类型、MIME信息头的邮箱信息。信息头只能使用US-ASCII字符，而非ASCII字符将通过编码转换为ASCII的方式使用。<br />为了建立一个MimeMessage对象，我们必须将Session对象作为MimeMessage构造方法的参数传入：<br /></p>
		<pre class="overflow">
				<br />MimeMessage message = new MimeMessage(session);<br /></pre>
		<p>
				<br />注意：对于MimeMessage类来讲存在着多种构造方法，比如使用输入流作为参数的构造方法。<br /><br />在建立了MimeMessage对象后，我们需要设置它的各个part，对于MimeMessage类来说，这些part就是MimePart接口。最基本的设置信息内容的方法就是通过表示信息内容和米么类型的参数调用setContent()方法：<br /></p>
		<pre class="overflow">
				<br />message.setContent("Hello", "text/plain");<br /></pre>
		<p>
				<br />然而，如果我们所使用的MimeMessage中信息内容是文本的话，我们便可以直接使用setText()方法来方便的设置文本内容。<br /></p>
		<pre class="overflow">
				<br />message.setText("Hello");<br /></pre>
		<p>
				<br />前面所讲的两种方法，对于文本信息，后者更为合适。而对于其它的一些信息类型，比如HTML信息，则要使用前者。<br />别忘记了，使用setSubject()方法对邮件设置邮件主题：<br /></p>
		<pre class="overflow">
				<br />message.setSubject("First");<br /></pre>
		<p>
				<br />
				<br />
				<span style="COLOR: green">D．Address</span>
				<br />到这里，我们已经建立了Session和Message，下面将介绍如何使用邮件地址类：Address。像Message一样，Address类也是一个抽象类，所以我们将使用javax.mail.internet.InternetAddress这个子类。<br />通过传入代表邮件地址的字符串，我们可以建立一个邮件地址类：<br /></p>
		<pre class="overflow">
				<br />Address address = new InternetAddress("president@whitehouse.gov"); <br /></pre>
		<p>
				<br />如果要在邮件地址后面增加名字的话，可以通过传递两个参数：代表邮件地址和名字的字符串来建立一个具有邮件地址和名字的邮件地址类：<br /></p>
		<pre class="overflow">
				<br />Address address = new InternetAddress("president@whitehouse.gov", "George Bush"); <br /></pre>
		<p>
				<br />本文在这里所讲的邮件地址类是为了设置邮件信息的发信人和收信人而准备的，在建立了邮件地址类后，我们通过message的setFrom()和setReplyTo()两种方法设置邮件的发信人：<br /></p>
		<pre class="overflow">
				<br />message.setFrom(address);<br />message.setReplyTo(address);<br /></pre>
		<p>
				<br />若在邮件中存在多个发信人地址，我们可用addForm()方法增加发信人：<br /></p>
		<pre class="overflow">
				<br />Address address[] = ...;<br />message.addFrom(address);<br /></pre>
		<p>
				<br />为了设置收信人，我们使用addRecipient()方法增加收信人，此方法需要使用Message.RecipientType的常量来区分收信人的类型：<br /></p>
		<pre class="overflow">
				<br />message.addRecipient(type, address)<br /></pre>
		<p>
				<br />下面是Message.RecipientType的三个常量:<br />Message.RecipientType.TO<br />Message.RecipientType.CC<br />Message.RecipientType.BCC<br />因此，如果我们要发送邮件给总统，并发用一个副本给第一夫人的话，下面的方法将被用到：<br /></p>
		<pre class="overflow">
				<br />Address toAddress = new InternetAddress("vice.president@whitehouse.gov");<br />Address ccAddress = new InternetAddress("first.lady@whitehouse.gov");<br />message.addRecipient(Message.RecipientType.TO, toAddress);<br />message.addRecipient(Message.RecipientType.CC, ccAddress);<br /></pre>
		<p>
				<br />JavaMail API并没有提供检查邮件地址有效性的机制。当然我们可以自己完成这个功能：验证邮件地址的字符是否按照RFC822规定的格式书写或者通过DNS服务器上的MX记录验证等。<br /><br /><span style="COLOR: green">E．Authenticator</span><br />像java.net类那样，JavaMail API通过使用授权者类（Authenticator）以用户名、密码的方式访问那些受到保护的资源，在这里“资源”就是指邮件服务器。在javax.mail包中可以找到这个JavaMail的授权者类（Authenticator）。<br />在使用Authenticator这个抽象类时，我们必须采用继承该抽象类的方式，并且该继承类必须具有返回PasswordAuthentication对象（用于存储认证时要用到的用户名、密码）getPasswordAuthentication()方法。并且要在Session中进行注册，使Session能够了解在认证时该使用哪个类。<br />下面代码片断中的MyAuthenticator就是一个Authenticator的子类。<br /></p>
		<pre class="overflow">
				<br />Properties props = new Properties();<br />// fill props with any information<br />Authenticator auth = new MyAuthenticator();<br />Session session = Session.getDefaultInstance(props, auth);<br /></pre>
		<p>
				<br />
				<br />
				<span style="COLOR: green">F．Transport</span>
				<br />在发送信息时，Transport类将被用到。这个类实现了发送信息的协议（通称为SMTP），此类是一个抽象类，我们可以使用这个类的静态方法send()来发送消息：<br /></p>
		<pre class="overflow">
				<br />Transport.send(message);<br /></pre>
		<p>
				<br />当然，方法是多样的。我们也可由Session获得相应协议对应的Transport实例。并通过传递用户名、密码、邮件服务器主机名等参数建立与邮件服务器的连接，并使用sendMessage()方法将信息发送，最后关闭连接：<br /></p>
		<pre class="overflow">
				<br />message.saveChanges(); // implicit with send()<br />Transport transport = session.getTransport("smtp");<br />transport.connect(host, username, password);<br />transport.sendMessage(message, message.getAllRecipients());<br />transport.close();<br /></pre>
		<p>
				<br />评论：上面的方法是一个很好的方法，尤其是在我们在同一个邮件服务器上发送多个邮件时。因为这时我们将在连接邮件服务器后连续发送邮件，然后再关闭掉连接。send()这个基本的方法是在每次调用时进行与邮件服务器的连接的，对于在同一个邮件服务器上发送多个邮件来讲可谓低效的方式。<br />注意：如果需要在发送邮件过程中监控mail命令的话，可以在发送前设置debug标志：<br /></p>
		<pre class="overflow">
				<br />session.setDebug(true)。<br /></pre>
		<p>
				<br />
				<br />
				<span style="COLOR: green">G．Store和Folder</span>
				<br />接收邮件和发送邮件很类似都要用到Session。但是在获得Session后，我们需要从Session中获取特定类型的Store，然后连接到Store，这里的Store代表了存储邮件的邮件服务器。在连接Store的过程中，极有可能需要用到用户名、密码或者Authenticator。<br /></p>
		<pre class="overflow">
				<br />// Store store = session.getStore("imap");<br />Store store = session.getStore("pop3");<br />store.connect(host, username, password);<br /></pre>
		<p>
				<br />在连接到Store后，一个Folder对象即目录对象将通过Store的getFolder()方法被返回，我们可从这个Folder中读取邮件信息：<br /></p>
		<pre class="overflow">
				<br />Folder folder = store.getFolder("INBOX");<br />folder.open(Folder.READ_ONLY);<br />Message message[] = folder.getMessages();<br /></pre>
		<p>
				<br />上面的例子首先从Store中获得INBOX这个Folder（对于POP3协议只有一个名为INBOX的Folder有效），然后以只读（Folder.READ_ONLY）的方式打开Folder，最后调用Folder的getMessages()方法得到目录中所有Message的数组。<br /><br />注意：对于POP3协议只有一个名为INBOX的Folder有效，而对于IMAP协议，我们可以访问多个Folder（想想前面讲的IMAP协议）。而且SUN在设计Folder的getMessages()方法时采取了很智能的方式：首先接收新邮件列表，然后再需要的时候（比如读取邮件内容）才从邮件服务器读取邮件内容。<br />在读取邮件时，我们可以用Message类的getContent()方法接收邮件或是writeTo()方法将邮件保存，getContent()方法只接收邮件内容（不包含邮件头），而writeTo()方法将包括邮件头。<br /></p>
		<pre class="overflow">
				<br />System.out.println(((MimeMessage)message).getContent());<br /></pre>
		<p>
				<br />在读取邮件内容后，别忘记了关闭Folder和Store。<br /></p>
		<pre class="overflow">
				<br />folder.close(aBoolean);<br />store.close();<br /></pre>
		<p>
				<br />传递给Folder.close()方法的boolean 类型参数表示是否在删除操作邮件后更新Folder。 <br /><br /><span style="COLOR: green">H．继续向前进！</span><br />在讲解了以上的七个Java Mail核心类定义和理解了简单的代码片断后，下文将详细讲解怎样使用这些类实现JavaMail API所要完成的高级功能。<br /><br /><span style="COLOR: blue">五、使用JavaMail API</span><br />在明确了JavaMail API的核心部分如何工作后，本人将带领大家学习一些使用Java Mail API任务案例。<br /><span style="COLOR: blue">1．发送邮件</span><br />在获得了Session后，建立并填入邮件信息，然后发送它到邮件服务器。这便是使用Java Mail API发送邮件的过程，在发送邮件之前，我们需要设置SMTP服务器：通过设置Properties的mail.smtp.host属性。<br /></p>
		<pre class="overflow">
				<br />String host = ...;<br />String from = ...;<br />String to = ...;<br /><br />// Get system properties<br />Properties props = System.getProperties();<br /><br />// Setup mail server<br />props.put("mail.smtp.host", host);<br /><br />// Get session<br />Session session = Session.getDefaultInstance(props, null);<br /><br />// Define message<br />MimeMessage message = new MimeMessage(session);<br />message.setFrom(new InternetAddress(from));<br />message.addRecipient(Message.RecipientType.TO, <br />  new InternetAddress(to));<br />message.setSubject("Hello JavaMail");<br />message.setText("Welcome to JavaMail");<br />// Send message<br />Transport.send(message);<br /></pre>
		<p>
				<br />由于建立邮件信息和发送邮件的过程中可能会抛出异常，所以我们需要将上面的代码放入到try-catch结构块中。<br /><br /><span style="COLOR: blue">2．接收邮件</span><br />为了在读取邮件，我们获得了session，并且连接到了邮箱的相应store，打开相应的Folder，然后得到我们想要的邮件，当然别忘记了在结束时关闭连接。<br /></p>
		<pre class="overflow">
				<br />String host = ...;<br />String username = ...;<br />String password = ...;<br /><br />// Create empty properties<br />Properties props = new Properties();<br /><br />// Get session<br />Session session = Session.getDefaultInstance(props, null);<br /><br />// Get the store<br />Store store = session.getStore("pop3");<br />store.connect(host, username, password);<br /><br />// Get folder<br />Folder folder = store.getFolder("INBOX");<br />folder.open(Folder.READ_ONLY);<br /><br />// Get directory<br />Message message[] = folder.getMessages();<br /><br />for (int i=0, n=message.length; i&lt;n; i++) {<br />   System.out.println(i + ": " + message[i].getFrom()[0] <br />     + "\t" + message[i].getSubject());<br />}<br /><br />// Close connection <br />folder.close(false);<br />store.close();<br /></pre>
		<p>
				<br />上面的代码所作的是从邮箱中读取每个邮件，并且显示邮件的发信人地址和主题。从技术角度讲，这里存在着一个异常的可能：当发信人地址为空时，getFrom()[0]将抛出异常。<br /><br />下面的代码片断有效的说明了如何读取邮件内容，在显示每个邮件发信人和主题后，将出现用户提示从而得到用户是否读取该邮件的确认，如果输入YES的话，我们可用Message.writeTo(java.io.OutputStream os)方法将邮件内容输出到控制台上，关于Message.writeTo()的具体用法请看JavaMail API。<br /></p>
		<pre class="overflow">
				<br />BufferedReader reader = new BufferedReader (<br />  new InputStreamReader(System.in));<br /><br />// Get directory<br />Message message[] = folder.getMessages();<br />for (int i=0, n=message.length; i&lt;n; i++) {<br />  System.out.println(i + ": " + message[i].getFrom()[0] <br />    + "\t" + message[i].getSubject());<br /><br />  System.out.println("Do you want to read message? " +<br />    "[YES to read/QUIT to end]");<br />  String line = reader.readLine();<br />  if ("YES".equals(line)) {<br />    message[i].writeTo(System.out);<br />  } else if ("QUIT".equals(line)) {<br />    break;<br />  }<br />}<br /></pre>
		<p>
				<br />
				<br />
				<span style="COLOR: blue">3．删除邮件和标志</span>
				<br />设置与message相关的Flags是删除邮件的常用方法。这些Flags表示了一些系统定义和用户定义的不同状态。在Flags类的内部类Flag中预定义了一些标志：<br />Flags.Flag.ANSWERED<br />Flags.Flag.DELETED<br />Flags.Flag.DRAFT<br />Flags.Flag.FLAGGED<br />Flags.Flag.RECENT<br />Flags.Flag.SEEN<br />Flags.Flag.USER<br />但需要在使用时注意的：标志存在并非意味着这个标志被所有的邮件服务器所支持。例如，对于删除邮件的操作，POP协议不支持上面的任何一个。所以要确定哪些标志是被支持的——通过访问一个已经打开的Folder对象的getPermanetFlags()方法，它将返回当前被支持的Flags类对象。<br />删除邮件时，我们可以设置邮件的DELETED标志： <br /></p>
		<pre class="overflow">
				<br />message.setFlag(Flags.Flag.DELETED, true);<br /></pre>
		<p>
				<br />但是首先要采用READ_WRITE的方式打开Folder：<br /></p>
		<pre class="overflow">
				<br />folder.open(Folder.READ_WRITE);<br /></pre>
		<p>
				<br />在对邮件进行删除操作后关闭Folder时，需要传递一个true作为对删除邮件的擦除确认。<br /></p>
		<pre class="overflow">
				<br />folder.close(true);<br /></pre>
		<p>
				<br />Folder类中另一种用于删除邮件的方法expunge()也同样可删除邮件，但是它并不为sun提供的POP3实现支持，而其它第三方提供的POP3实现支持或者并不支持这种方法。<br />另外，介绍一种检查某个标志是否被设置的方法：Message.isSet(Flags.Flag flag)方法，其中参数为被检查的标志。<br /><br /><span style="COLOR: blue">4．邮件认证</span><br />我们在前面已经学会了如何使用Authenticator类来代替直接使用用户名和密码这两字符串作为Session.getDefaultInstance()或者Session.getInstance()方法的参数。在前面的小试牛刀后，现在我们将了解到全面认识一下邮件认证。<br />我们在此取代了直接使用邮件服务器主机名、用户名、密码这三个字符串作为连接到POP3 Store的方式，使用存储了邮件服务器主机名信息的属性文件，并在获得Session时传入自定义的Authenticator实例：<br /></p>
		<pre class="overflow">
				<br />// Setup properties<br />Properties props = System.getProperties();<br />props.put("mail.pop3.host", host);<br /><br />// Setup authentication, get session<br />Authenticator auth = new PopupAuthenticator();<br />Session session = Session.getDefaultInstance(props, auth);<br /><br />// Get the store<br />Store store = session.getStore("pop3");<br />store.connect();<br /></pre>
		<p>
				<br />
				<br />PopupAuthenticator类继承了抽象类Authenticator，并且通过重载Authenticator类的getPasswordAuthentication()方法返回PasswordAuthentication类对象。而getPasswordAuthentication()方法的参数param是以逗号分割的用户名、密码组成的字符串。<br /></p>
		<pre class="overflow">
				<br />import javax.mail.*;<br />import java.util.*;<br /><br />public class PopupAuthenticator extends Authenticator {<br /><br />  public PasswordAuthentication getPasswordAuthentication(String param) {<br />    String username, password;<br /><br />    StringTokenizer st = new StringTokenizer(param, ",");<br />    username = st.nextToken();<br />    password = st.nextToken();<br /><br />    return new PasswordAuthentication(username, password);<br />  }<br /><br />}<br /></pre>
		<p>
				<br />
				<br />
				<span style="COLOR: blue">5．回复邮件</span>
				<br />回复邮件的方法很简单：使用Message类的reply()方法，通过配置回复邮件的收件人地址和主题（如果没有提供主题的话，系统将默认将“Re：”作为邮件的主体），这里不需要设置任何的邮件内容，只要复制发信人或者reply-to到新的收件人。而reply()方法中的boolean参数表示是否将邮件回复给发送者（参数值为false），或是恢复给所有人（参数值为true）。<br />补充一下，reply-to地址需要在发信时使用setReplyTo()方法设置。<br /></p>
		<pre class="overflow">
				<br />MimeMessage reply = (MimeMessage)message.reply(false);<br />reply.setFrom(new InternetAddress("president@whitehouse.gov"));<br />reply.setText("Thanks");<br />Transport.send(reply);<br /></pre>
		<p>
				<br />
				<br />
				<span style="COLOR: blue">6．转发邮件</span>
				<br />转发邮件的过程不如前面的回复邮件那样简单，它将建立一个转发邮件，这并非一个方法就能做到。<br />每个邮件是由多个部分组成，每个部分称为一个邮件体部分，是一个BodyPart类对象，对于MIME类型邮件来讲就是MimeBodyPart类对象。这些邮件体包含在成为Multipart的容器中对于MIME类型邮件来讲就是MimeMultiPart类对象。在转发邮件时，我们建立一个文字邮件体部分和一个被转发的文字邮件体部分，然后将这两个邮件体放到一个Multipart中。说明一下，复制一个邮件内容到另一个邮件的方法是仅复制它的DataHandler（数据处理者）即可。这是由JavaBeans Activation Framework定义的一个类，它提供了对邮件内容的操作命令的访问、管理了邮件内容操作，是不同的数据源和数据格式之间的一致性接口。<br /></p>
		<pre class="overflow">
				<br />// Create the message to forward<br />Message forward = new MimeMessage(session);<br /><br />// Fill in header<br />forward.setSubject("Fwd: " + message.getSubject());<br />forward.setFrom(new InternetAddress(from));<br />forward.addRecipient(Message.RecipientType.TO, <br />  new InternetAddress(to));<br /><br />// Create your new message part<br />BodyPart messageBodyPart = new MimeBodyPart();<br />messageBodyPart.setText(<br />  "Here you go with the original message:\n\n");<br /><br />// Create a multi-part to combine the parts<br />Multipart multipart = new MimeMultipart();<br />multipart.addBodyPart(messageBodyPart);<br /><br />// Create and fill part for the forwarded content<br />messageBodyPart = new MimeBodyPart();<br />messageBodyPart.setDataHandler(message.getDataHandler());<br /><br />// Add part to multi part<br />multipart.addBodyPart(messageBodyPart);<br /><br />// Associate multi-part with message<br />forward.setContent(multipart);<br /><br />// Send message<br />Transport.send(forward);<br /></pre>
		<p>
				<br />
				<br />
				<span style="COLOR: blue">7．使用附件</span>
				<br />附件作为与邮件相关的资源经常以文本、表格、图片等格式出现，如流行的邮件客户端一样，我们可以用JavaMail API从邮件中获取附件或是发送带有附件的邮件。<br /><br /><span style="COLOR: green">A．发送带有附件的邮件</span><br />发送带有附件的邮件的过程有些类似转发邮件，我们需要建立一个完整邮件的各个邮件体部分，在第一个部分（即我们的邮件内容文字）后，增加一个具有DataHandler的附件而不是在转发邮件时那样复制第一个部分的DataHandler。<br /><br />如果我们将文件作为附件发送，那么要建立FileDataSource类型的对象作为附件数据源；如果从URL读取数据作为附件发送，那么将要建立URLDataSource类型的对象作为附件数据源。<br /><br />然后将这个数据源（FileDataSource或是URLDataSource）对象作为DataHandler类构造方法的参数传入，从而建立一个DataHandler对象作为数据源的DataHandler。<br /><br />接着将这个DataHandler设置为邮件体部分的DataHandler。这样就完成了邮件体与附件之间的关联工作，下面的工作就是BodyPart的setFileName()方法设置附件名为原文件名。<br /><br />最后将两个邮件体放入到Multipart中，设置邮件内容为这个容器Multipart，发送邮件。<br /></p>
		<pre class="overflow">
				<br />// Define message<br />Message message = new MimeMessage(session);<br />message.setFrom(new InternetAddress(from));<br />message.addRecipient(Message.RecipientType.TO, <br />  new InternetAddress(to));<br />message.setSubject("Hello JavaMail Attachment");<br /><br />// Create the message part <br />BodyPart messageBodyPart = new MimeBodyPart();<br /><br />// Fill the message<br />messageBodyPart.setText("Pardon Ideas");<br /><br />Multipart multipart = new MimeMultipart();<br />multipart.addBodyPart(messageBodyPart);<br /><br />// Part two is attachment<br />messageBodyPart = new MimeBodyPart();<br />DataSource source = new FileDataSource(filename);<br />messageBodyPart.setDataHandler(new DataHandler(source));<br />messageBodyPart.setFileName(filename);<br />multipart.addBodyPart(messageBodyPart);<br /><br />// Put parts in message<br />message.setContent(multipart);<br /><br />// Send the message<br />Transport.send(message);<br /></pre>
		<p>
				<br />如果我们使用servlet实现发送带有附件的邮件，则必须上传附件给servlet，这时需要注意提交页面form中对编码类型的设置应为multipart/form-data。<br /></p>
		<pre class="overflow">
				<br />&lt;FORM ENCTYPE="multipart/form-data" <br />    method=post action="/myservlet"&gt; <br />  &lt;INPUT TYPE="file" NAME="thefile"&gt;<br />  &lt;INPUT TYPE="submit" VALUE="Upload"&gt;<br />&lt;/FORM&gt;<br /></pre>
		<p>
				<br />
				<br />
				<span style="COLOR: green">B．读取邮件中的附件</span>
				<br />读取邮件中的附件的过程要比发送它的过程复杂一点。因为带有附件的邮件是多部分组成的，我们必须处理每一个部分获得邮件的内容和附件。<br />但是如何辨别邮件信息内容和附件呢？Sun在Part类（BodyPart类实现的接口类）中提供了getDisposition()方法让开发者获得邮件体部分的部署类型，当该部分是附件时，其返回之将是Part.ATTACHMENT。但附件也可以没有部署类型的方式存在或者部署类型为Part.INLINE，无论部署类型为Part.ATTACHMENT还是Part.INLINE，我们都能把该邮件体部分导出保存。<br /></p>
		<pre class="overflow">
				<br />Multipart mp = (Multipart)message.getContent();<br /><br />for (int i=0, n=multipart.getCount(); i&lt;n; i++) {<br />  Part part = multipart.getBodyPart(i));<br /><br />  String disposition = part.getDisposition();<br /><br />  if ((disposition != null) &amp;&amp; <br />      ((disposition.equals(Part.ATTACHMENT) || <br />       (disposition.equals(Part.INLINE))) {<br />    saveFile(part.getFileName(), part.getInputStream());<br />  }<br />}<br /></pre>
		<p>
				<br />下列代码中使用了saveFile方法是自定义的方法，它根据附件的文件名建立一个文件，如果本地磁盘上存在名为附件的文件，那么将在文件名后增加数字表示区别。然后从邮件体中读取数据写入到本地文件中（代码省略）。<br /></p>
		<pre class="overflow">
				<br />// from saveFile()<br />File file = new File(filename);<br />for (int i=0; file.exists(); i++) {<br />  file = new File(filename+i);<br />}<br /></pre>
		<p>
				<br />以上是邮件体部分被正确设置的简单例子，如果邮件体部分的部署类型为null，那么我们通过获得邮件体部分的MIME类型来判断其类型作相应的处理，代码结构框架如下：<br /></p>
		<pre class="overflow">
				<br />if (disposition == null) {<br />  // Check if plain<br />  MimeBodyPart mbp = (MimeBodyPart)part;<br />  if (mbp.isMimeType("text/plain")) {<br />    // Handle plain<br />  } else {<br />    // Special non-attachment cases here of <br />    // image/gif, text/html, ...<br />  }<br />...<br />}<br /></pre>
		<p>
				<br />
				<br />
				<span style="COLOR: blue">8．处理HTML邮件</span>
				<br />前面的例子中发送的邮件都是以文本为内容的（除了附件），下面将介绍如何接收和发送基于HTML的邮件。<br /><span style="COLOR: green">A．发送HTML邮件</span><br />假如我们需要发送一个HTML文件作为邮件内容，并使邮件客户端在读取邮件时获取相关的图片或者文字的话，只要设置邮件内容为html代码，并设置内容类型为text/html即可：<br /></p>
		<pre class="overflow">
				<br />String htmlText = "&lt;H1&gt;Hello&lt;/H1&gt;" + <br />  "&lt;img src=\"http://www.jguru.com/images/logo.gif\"&gt;";<br />message.setContent(htmlText, "text/html"));<br /></pre>
		<p>
				<br />请注意：这里的图片并不是在邮件中内嵌的，而是在URL中定义的。邮件接收者只有在线时才能看到。<br />在接收邮件时，如果我们使用JavaMail API接收邮件的话是无法实现以HTML方式显示邮件内容的。因为JavaMail API邮件内容视为二进制流。所以要显示HTML内容的邮件，我们必须使用JEditorPane或者第三方HTML展现组件。<br /><br />以下代码显示了如何使用JEditorPane显示邮件内容：<br /></p>
		<pre class="overflow">
				<br />if (message.getContentType().equals("text/html")) {<br />  String content = (String)message.getContent();<br />  JFrame frame = new JFrame();<br />  JEditorPane text = new JEditorPane("text/html", content);<br />  text.setEditable(false);<br />  JScrollPane pane = new JScrollPane(text);<br />  frame.getContentPane().add(pane);<br />  frame.setSize(300, 300);<br />  frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);<br />  frame.show();<br />}<br /></pre>
		<p>
				<br />
				<br />
				<span style="COLOR: green">B．在邮件中包含图片</span>
				<br />如果我们在邮件中使用HTML作为内容，那么最好将HTML中使用的图片作为邮件的一部分，这样无论是否在线都会正确的显示HTML中的图片。处理方法就是将HTML中用到的图片作为邮件附件并使用特殊的cid URL作为图片的引用，这个cid就是对图片附件的Content-ID头的引用。<br />处理内嵌图片就像向邮件中添加附件一样，不同之处在于我们必须通过设置图片附件所在的邮件体部分的header中Content-ID为一个随机字符串，并在HTML中img的src标记中设置为该字符串。这样就完成了图片附件与HTML的关联。<br /></p>
		<pre class="overflow">
				<br />String file = ...;<br /><br />// Create the message<br />Message message = new MimeMessage(session);<br /><br />// Fill its headers<br />message.setSubject("Embedded Image");<br />message.setFrom(new InternetAddress(from));<br />message.addRecipient(Message.RecipientType.TO, <br />  new InternetAddress(to));<br /><br />// Create your new message part<br />BodyPart messageBodyPart = new MimeBodyPart();<br />String htmlText = "&lt;H1&gt;Hello&lt;/H1&gt;" + <br />  "&lt;img src=\"cid:memememe\"&gt;";<br />messageBodyPart.setContent(htmlText, "text/html");<br /><br />// Create a related multi-part to combine the parts<br />MimeMultipart multipart = new MimeMultipart("related");<br />multipart.addBodyPart(messageBodyPart);<br /><br />// Create part for the image<br />messageBodyPart = new MimeBodyPart();<br /><br />// Fetch the image and associate to part<br />DataSource fds = new FileDataSource(file);<br />messageBodyPart.setDataHandler(new DataHandler(fds));<br />messageBodyPart.setHeader("Content-ID","&lt;memememe&gt;");<br /><br />// Add part to multi-part<br />multipart.addBodyPart(messageBodyPart);<br /><br />// Associate multi-part with message<br />message.setContent(multipart);<br /></pre>
		<p>
				<br />
				<br />
				<span style="COLOR: blue">9．在邮件中搜索短语</span>
				<br />JavaMail API提供了过滤器机制，它被用来建立搜索短语。这个短语由javax.mail.search包中的SearchTerm抽象类来定义，在定义后我们便可以使用Folder的Search()方法在Folder中查找邮件：<br /></p>
		<pre class="overflow">
				<br />SearchTerm st = ...;<br />Message[] msgs = folder.search(st);<br /></pre>
		<p>
				<br />下面有22个不同的类（继承了SearchTerm类）供我们使用：<br />AND terms (class AndTerm)<br />OR terms (class OrTerm)<br />NOT terms (class NotTerm)<br />SENT DATE terms (class SentDateTerm)<br />CONTENT terms (class BodyTerm)<br />HEADER terms (FromTerm / FromStringTerm, RecipientTerm / RecipientStringTerm, SubjectTerm, etc.)<br />使用这些类定义的断语集合，我们可以构造一个逻辑表达式，并在Folder中进行搜索。下面是一个实例：在Folder中搜索邮件主题含有“ADV”字符串或者发信人地址为friend@public.com的邮件。<br /></p>
		<pre class="overflow">
				<br />SearchTerm st = <br />  new OrTerm(<br />    new SubjectTerm("ADV:"), <br />    new FromStringTerm("friend@public.com"));<br />Message[] msgs = folder.search(st);<br /></pre>
		<p>
				<br />
				<br />
				<span style="COLOR: blue">六、参考资源</span>
				<br />
				<a href="http://java.sun.com/products/javamail/index.jsp" target="_new">
						<font color="#002c99">JavaMail API Home</font>
				</a>
				<br />
				<a href="http://java.sun.com/developer/onlineTraining/JavaMail/contents.html" target="_new">
						<font color="#002c99">Sun’s JavaMail API基础</font>
				</a>
				<br />
				<a href="http://java.sun.com/products/javabeans/glasgow/jaf.html" target="_new">
						<font color="#002c99">JavaBeans Activation Framework Home</font>
				</a>
				<br />
				<a href="http://mail.java.sun.com/archives/javamail-interest.html" target="_new">
						<font color="#002c99">javamail-interest mailing list</font>
				</a>
				<br />
				<a href="http://java.sun.com/products/javamail/FAQ.html" target="_new">
						<font color="#002c99">Sun's JavaMail FAQ</font>
				</a>
				<br />
				<a href="http://www.jguru.com/faq/JavaMail" target="_new">
						<font color="#002c99">jGuru's JavaMail FAQ</font>
				</a>
				<br />
				<a href="http://java.sun.com/products/javamail/Third_Party.html" target="_new">
						<font color="#002c99">Third Party Products List</font>
				</a>
				<br />
		</p>
<img src ="http://www.blogjava.net/xixidabao/aggbug/70501.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixidabao/" target="_blank">JAVA之路</a> 2006-09-19 13:01 <a href="http://www.blogjava.net/xixidabao/archive/2006/09/19/70501.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaMail类</title><link>http://www.blogjava.net/xixidabao/archive/2006/09/19/70499.html</link><dc:creator>JAVA之路</dc:creator><author>JAVA之路</author><pubDate>Tue, 19 Sep 2006 04:57:00 GMT</pubDate><guid>http://www.blogjava.net/xixidabao/archive/2006/09/19/70499.html</guid><description><![CDATA[
		<p>
				<font size="3">&lt;转&gt;JavaMail的三个主要类：<br />1、Session类<br />Session类表示了一个基本的邮件会话过程，它提供了一个邮件的生存过程。Session对象需要java.util.Properties对象对其配置邮件环境属性，它利用Properties对象来获取诸如邮件服务器、用户名、密码等信息，以及其他可在整个应用程序中共享的信息。</font>
		</p>
		<p>
				<br />
				<font size="3">2、Message类<br />在创建了一个邮件会话Session后，再用Message类提供了一封邮件的所有信息。它是一个抽象类，必须由其子类来构造。<br />MimeMessage message=new MimeMessage(sendsession);<br />//MimeMessage是Message的子类，可以使用当前的Session对象创建一个新的MimeMessage对象，然后就可以对其进行各种操作。<br />message.setSubject("This is subject of the e-mail");<br />//设置邮件的标题<br />message.setText("Hello,I am a e-mail"); <br />//设置纯文本邮件的内容<br />InternetAddress sender=new InternetAddress("</font>
				<a href="mailto:cx19830801@163.com">
						<font size="3">cx19830801@163.com</font>
				</a>
				<font size="3">");<br />//InternetAddress类通过一个合法的e-mail构造出e-mail地址对象<br />message.setForm(sender);<br />//设置邮件的发送方地址<br />InternetAddress receiver=new InternetAddress("</font>
				<a href="mailto:Webmaster@hudax.com">
						<font size="3">Webmaster@hudax.com</font>
				</a>
				<font size="3">");<br />message.addRecipient(receiver,RecipientType.TO); <br />//设置接收方地址<br />设置接收方地址使用addRecipient方法，地址类型有三种：<br />RecipientType.TO:e-mail的发送地址；<br />RecipientType.CC:抄送地址，可以为多个；<br />RecipientType.BCC:暗送地址，可以为多个。</font>
		</p>
		<p>
				<font size="3">3、Transport类<br />邮件发送类。<br />邮件发送方法：send(message); </font>
		</p>
		<p>
				<font size="3">e.g<br />Properties props=new Properties(); <br />Session sendsession = Session.getInstance(props, null);<br />//使用getInstance方法获取到这个信息<br />props.put("mail.smtp.host", "smtp.163.com");<br />//向属性中写入SMTP服务器的地址，为Session设置一个SMTP邮件服务器 <br />props.put("mail.smtp.auth","true");<br />//用Properties对象的put方法设置了SMTP邮件服务器需要进行权限的认证； <br />sendsession.setDebug(true);<br />//用Session对象的setDebug方法设置输出发送邮件时的调试信息；可在Tomcat服务器上看到同SMTP邮件服务器交互过程中的输出信息。 <br />MimeMessage message=new MimeMessage(sendsession);<br />//MimeMessage是Message的子类，可以使用当前的Session对象创建一个新的MimeMessage对象，然后就可以对其进行各种操作。 <br />message.setFrom(new InternetAddress(request.getParameter("from"))); <br />//设置发信人地址 <br />message.setRecipient(Message.RecipientType.TO,new InternetAddress(request.getParameter("to"))); <br />//设置收信人地址 <br />message.setSubject(new String(request.getParameter("subject").getBytes("ISO8859_1"),"GBK"));<br />//设置e-mail标题 <br />message.setSentDate(new Date());<br />//设置e-mail发送时间<br />message.setText(new String(request.getParameter("text").getBytes("ISO8859_1"),"GBK"));<br />//设置e-mail内容 <br />message.saveChanges();<br />//保存对于Email的修改,用message对象的saveChanges方法将邮件信息保存起来； <br />Transport transport=sendsession.getTransport("smtp"); <br />//由当前的session对象使用方法getTransport创建并初始化Transport对象 <br />transport.connect("smtp.163.com","username","password");<br />//连接到SMTP服务器 <br />transport.sendMessage(message,message.getAllRecipients());<br />//发送e-mail <br />transport.close();<br />//关闭Transport连接 </font>
		</p>
		<p>
				<font size="3">
				</font>
		</p>
		<p>
				<font size="3">
				</font>
		</p>
		<p>
				<font size="3">发送带有附件的邮件：<br />1、BodyPart类<br />BodyPart类表示多部分的MIME信息中某一个部分的信息内容，它是一个抽象类，需要用其子类MimeBodyPart创建。<br />BodyPart messageBodyPart=new MimeBodyPart();<br />通常邮件的正文是一个BodyPart对象，附件则是另一个BodyPart对象。</font>
		</p>
		<p>
				<font size="3">2、MultiPart类<br />MultiPart类表示多部分的MIME信息的内容，它是一个抽象类，需要用其子类MimeMultipart来创建。还可以通过其方法addBodyPart()来创建。<br />Multipart multipart=new MimeMultipart();<br />将代表邮件正文的BodyPart对象和代表邮件附件的BodyPart对象分别加入到MimeMultipart对象中。</font>
		</p>
		<p>
				<font size="3">3、DataSource类<br />DataSource类表示本地文件和服务器可以直接访问的资源，它是一个抽象类，用其子类FileDataSource来创建。<br />FileDataSource fds=new FileDataSource("c:/test.doc");</font>
		</p>
		<p>
				<font size="3">4、DataHandler类<br />DataHandler为不同的数据源和数据格式提供提供了一个统一的接口。<br />messageBodyPart.setDataHandler(new DataHandler(fds));<br />附件被封装到一个DataHandler对象，BodyPart对象可以用方法setDataHandler将封装了附件的DataHandler对象加进来。</font>
		</p>
		<p>
				<font size="3">发送附件时的处理过程：<br />BodyPart messageBodyPart=new MimeBodyPart();<br />Multipart multipart=new MimeMultipart();<br />multipart.addBodyPart(messageBodyPart);<br />//在要发送附件时，先建立代表邮件正文的BodyPart对象，并把它加到Multipart对象中去<br />messageBodyPart=new MimeBodyPart();<br />//建立代表邮件附件部分的BodyPart对象<br />DataSource source=new FileDataSource(attachment);<br />messageBodyPart.setDataHandler(new DataHandler(source));<br />用setDataHandler方法将获取到的附件包含进来<br />messageBodyPart.setFileName(attachment);<br />//设置附件文件名<br />multipart.addBodyPart(messageBodyPart);<br />//将与附件相关的内容设置好之后，就可以把代表此附件部分的BodyPart对象加到Multipart对象中去了，最后将Multipart对象放到代表邮件信息的Message对象中，这样就可以发送带有附件的邮件了。</font>
		</p>
		<p>
				<font size="3">
				</font>
		</p>
		<p>
				<font size="3">
				</font>
		</p>
		<p>
				<br />
				<font size="3">接收邮件：<br />1、URLName类<br />URLName类实际上是对于某台邮件服务器上某个用户的一次操作的唯一标识，它的格式为：<br />协议名称：//用户名：密码@邮件服务器/<br />URLName irln=new URLName("pop3://username:password@163.com/");</font>
		</p>
		<p>
				<font size="3">2、Store类<br />Store类是用于接收邮件的类，它对邮件进行读、写、监视、查找等操作。接收邮件时首先要连接到邮件服务器上的一个邮箱，这需要调用Session对象的getStore方法来创建一个Store对象。<br />Store store=session.getStore("pop3");<br />//这个方法要设置Store对象所使用的协议，通常为POP3；<br />store.connect("pop.163.com","username","password");<br />//在创建了Store对象之后，可以使用它的connect方法连接到远程邮件服务器中的邮箱。</font>
		</p>
		<p>
				<font size="3">3、Folder类<br />在连接到邮箱之后，就可以打开包含邮件的消息文件夹了，打开消息文件夹需要先使用Store对象的getFolder方法创建一个Folder对象作为消息文件夹。<br />Folder folder=store.getFolder("INBOX");<br />//参数用来设置消息文件夹的名字，通常设为INBOX，因为POP3协议只支持唯一的消息文件夹INBOX。<br />使用Folder类的open方法来打开消息文件夹：<br />folder.open(Folder.READ_ONLY);<br />它有两种可选模式：READ_ONLY和READ_WRITE<br />要从消息文件夹中取出邮件，可以使用Folder类的getMessage方法或getMessages方法。<br />Message message=inbox.getMessage(i);<br />//方法getMessage返回以其参数为索引的Message对象<br />Message message[]=folder.getMessages();<br />//方法getMessages返回一个Message对象数组<br />int count=folder.getMessageCount();<br />//使用Folder类的getMessageCount()得到消息文件夹中的邮件总数</font>
		</p>
		<p>
				<font size="3">4、Message类<br />与前面的Message类相同，在这里介绍它在显示邮件列表和删除邮件时所使用的一些方法。<br />(1)、方法getSubject得到一封邮件的标题；<br />(2)、方法isSet用来判断一封邮件是否被标记为删除(DELETED)、是否用户已经收取过(SEEN)、是否被回复过(ANSWERED)、是否是一个草稿(DRAFT)等等；<br />(3)、方法setFlag设置一封邮件为待删除。</font>
		</p>
		<p>
				<font size="3">在接收和检索邮件之后，还要关闭程序使用到的资源，<br />folder.close(true);<br />store.cloase();<br />这两个方法关闭收件箱和到邮件服务器的连接。</font>
		</p>
		<p>
				<br />
				<font size="3">显示邮件详细信息的Message类的方法：<br />1、Address[] getFrom()：得到发件人的地址，返回一个Address类的对象数组；<br />2、Address[] getRecipients(Message.RecipientType.TO):得到收件人的地址列表；<br />3、Address[] getSubject():得到邮件标题<br />4、Address[] getContent():得到普通文本邮件的详细内容；<br />5、Date getSentDate():得到邮件发送的时间；<br />6、Date getReceivedDate():得到接受邮件的时间；<br />7、Boolean isMimeType("text/plain"):判断邮件的MIME(多用途的Internet邮件扩展)类型；<br />Address类是邮件的地址，它是一个抽象类，可以由其子类InternetAddress来实现。</font>
		</p>
		<p>
				<font size="3">接收带附件的邮件：<br />先用Message对象的isMimeType方法判断该邮件是否是一个多部分内容的邮件：<br />if(message.isMimeType("multipart/*"))<br />如果是的话，就表明该邮件带有附件，这是可以用Message对象的getContent方法获得代表该邮件的多部分内容的Multipart对象：<br />Multipart multipart=(Multipart)message.getContent(); <br />然后依次获取Multipart对象的每个部分，并用方法getDisposition获得该部分的属性：<br />Part p=multipart.getBodypart(i);<br />String disposition=p.getDisposition();<br />如果该部分的属性是Part.ATTACHMENT或Part.INLINE，就表明它是附件的内容；如果该部分的属性为null，就表明它是普通文本的内容，在对属性进行判断之后，就可以进行相应的处理了：<br />if((disposition!=null)&amp;&amp;(disposition.equals(Part.ATTACHMENT)||disposition.equals(Part.INLINE)))<br />{<br />........<br />}<br />else if(disposition==null)<br />{<br />if(p.isMimeType("text/plain"))<br />{<br />.....<br />}<br />}</font>
		</p>
		<p>
				<font size="3">
				</font>
		</p>
		<p>
				<font size="3">
				</font>
		</p>
		<p>
				<font size="3">下载附件的处理：<br />先设置附件的类型属性，并生成下载的头信息：<br />response.setContentType(p.getContentType());<br />response.setHeader("Content-Disposition","attachment;filename=\""+p.getFileName()+"\"");<br />然后设置下载过程中的输入流和输出流，为下载附件做好准备工作：<br />OutputStream os=response.getOutputStream();<br />InputStream is=p.getInputStream();<br />最后就可以执行下载的操作了：<br />int c=is.read();<br />while(c!=-1)<br />{<br />os.write(c);<br />c=is.read();<br />}</font>
		</p>
		<p>
				<font size="3">
				</font>
		</p>
		<p>
				<font size="3">
				</font>
		</p>
		<p>
				<br />
				<font size="3">邮件过滤：<br />要对邮件进行过滤，需要先查找出所有符合过滤条件的邮件，然后对这些邮件设置待删除标记，最后在关闭消息文件夹时真正删除它们。JavaMail提供了一个包javax.mail.search专门用来查找符合条件的邮件，因此可以这样来实现对邮件的过滤：<br />建立一个SearchTerm对象，它是一个抽象类，需要用其子类来构造，常用的有以下这些子类，这些字类的构造方法中参数就是过滤的规则，满足这些规则的邮件将被过滤掉。<br />AndTerm:查找同时满足多个条件的邮件；<br />OrTerm:只要邮件满足多个条件中的某一个条件，就查找出来；<br />NotTerm:查找不满足条件的邮件；<br />SentDateTerm:查找某个特定时间发送出来的邮件；<br />BodyTerm:查找正文部分的内容符合条件的邮件；<br />SubjectTerm:查找标题部分内容符合条件的邮件；<br />FromTerm:如果邮件的发件人地址头满足条件，就查找出来；<br />FromStringTerm:如果邮件发件人的地址字符串满足条件，就查找出来；<br />RecipientTerm:如果邮件的收件人地址头满足条件，就查找出来；<br />RecipientStringTerm:如果邮件收件人的地址字符串满足条件，就查找出来<br />例如：要设立这样的一个过滤规则，凡是标题中含有“惊喜”的邮件或者是由</font>
				<a href="mailto:webmaster@hudax.com">
						<font size="3">webmaster@hudax.com</font>
				</a>
				<font size="3">发送过来的邮件都将被过滤。<br />SearchTerm st=new OrTerm(new SubjectTerm("惊喜"),new FromStringTerm("</font>
				<a href="mailto:webmaster@hudax.com">
						<font size="3">webmaster@hudax.com</font>
				</a>
				<font size="3">"));<br />//建立SearchTerm对象；<br />Message[] message=folder.search(st);<br />//设立了过滤规则之后，调用Folder对象的search方法在接收到的邮件中寻找符合过滤条件的邮件；并将它们作为Message的对象数组返回；<br />message.setflsg(Flags.Flag.DELETED,true);<br />//将过滤出的所有邮件设置删除标志；</font>
		</p>
<img src ="http://www.blogjava.net/xixidabao/aggbug/70499.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixidabao/" target="_blank">JAVA之路</a> 2006-09-19 12:57 <a href="http://www.blogjava.net/xixidabao/archive/2006/09/19/70499.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>