JSP虚拟主机,jsp空间,java空间,java虚拟空间JSP虚拟主机,jsp空间,java空间,java虚拟空间

用javaMail实现对邮件的查找



作者:    文章来源:
发布日期:2007年04月17日
用javaMail来实现邮件的查找非常的容易,我把自己平时的经验总结成如下这篇文章,希望对大家能有帮助,同时也希望各位能给
如下程序多提一些自己的看法:

下面是本程序的主要框架:
//|++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

  1. package webmail.mail.search;
  2. import javax.mail.*;
  3. import java.util.Iterator;
  4. import java.util.Date;
  5. import java.util.HashSet;
  6. import java.util.ArrayList;
  7. import java.util.Calendar;
  8. import java.util.Properties;
  9. import javax.mail.internet.*;
  10. import javax.mail.search.*;
  11. import webmail.mail.search.PersonalTerm;
  12. import webmail.mail.search.JAttachTerm;
  13. import webmail.mail.search.JBodyTerm;
  14. import webmail.mail.*;
  15. import webmail.mail.MimeMessageParser;
  16. /**
  17.  * description: 一个简单的邮件查找类,用来查找特定主题的邮件,特定日期,或者
  18.  * 是包含有附件的邮件
  19.  * lastmodify: 2004-10-09
  20.  * <p>注: JavaMail API中的javax.mail.search包中的BodyTerm和AttachTerm在使用时
  21.  * 有问题,这里使用我扩展SearchTerm的JBodyTerm和JAttachTerm,同时由于javax.
  22.  * mail.search包中的SubjectTerm取邮件主题直接调用JavaMail的getSubject()方法
  23.  * 这样得到的结果有时候不正常,可以扩展SearchTerm来定义自己的Term(这个是下
  24.  * 一篇文章要写的内容)
  25.  * @author wang weiping of BeiJing flow.Inc
  26.  * @version v1.0.1
  27.  */
  28. public class MessageQuerier {
  29.       private String body = "";
  30.       private ArrayList list = new ArrayList();
  31.       private int comparison = ComparisonTerm.EQ;
  32.       public static final String OR = "or";
  33.       public static final String AND = "and";
  34.       
  35.       //默认构造方法
  36.       public MessageQuerier() {}
  37.       public void setComparison(String string) {
  38.             if (string.equals(">")) {
  39.                   comparison = ComparisonTerm.GE;
  40.             } else if (string.equals("<")) {
  41.                   comparison = ComparisonTerm.LE;
  42.             }
  43.       }
  44.       public int getComparison() {
  45.             return this.comparison;
  46.       }
  47.       /**
  48.        * 根据指定的字符串来查找所有邮件主题中包含此字符串的所有邮件
  49.        * @param subject 邮件主题中所要包含的字符串
  50.        */
  51.       public void setSubject(String subject) {
  52.             SearchTerm subterm = new JSubjectTerm(subject);
  53.             list.add(subterm);
  54.       }
  55.       
  56.       public void setRecipients(String recipients){
  57.             try{
  58.                   SearchTerm rterm = new RecipientTerm   (Message.RecipientType.TO,new InternetAddress(recipients));
  59.                   list.add(rterm);
  60.             }catch(Exception ex){
  61.                   //ignore exception
  62.                   ex.printStackTrace();
  63.             }
  64.       }
  65.       
  66.       public void setRecipientPersons(String recipientPersons){
  67.             SearchTerm rpTerm = new RecipientPersonTerm(recipientPersons);
  68.             list.add(rpTerm);
  69.       }
  70.       
  71.       /**
  72.        * 根据指定的字符串来查找发件人地址中包含此字符串的所有邮件
  73.        * @param from 设置发件人地址中要包含的字符串
  74.        */
  75.       public void setFrom(String from) {
  76.             try {
  77.                   SearchTerm fterm = new FromTerm(new InternetAddress(from));
  78.                   list.add(fterm);
  79.             } catch (Exception ex) {
  80.                   System.err.println("CoffeeWebMail reportException: " + ex.toString());
  81.                   ex.printStackTrace();
  82.             }
  83.       }
  84.       /**
  85.        * Created 2004-10-9
  86.        * 此类用了自定义的查找器PersonalTerm,此类从javax.mail.search.StringTerm
  87.        * 中继承下来,重写了StringTerm类的match()方法
  88.        * <p>根据发件人的姓名来查找此发件人发来的所有邮件</p>
  89.        * @param personal 设置发件人的姓名
  90.        */
  91.       public void setPersonal(String personal) {
  92.             try {
  93.                   PersonalTerm pterm = new PersonalTerm(personal);
  94.                   list.add(pterm);
  95.             } catch (Exception ex) {
  96.                   System.err.println("CoffeeWebMail reportException: " + ex.toString());
  97.                   ex.printStackTrace();
  98.             }
  99.       }
  100.       /**
  101.        * Created 2004-10-09
  102.        * 
  103.        * 此类用到了自定义的查找器JAttachTerm,此类从javax.mail.search.SearchTerm中
  104.        * 直接继承下来,重写了SearchTerm类的match()方法
  105.        * <p>根据是否包含附件来查找匹配的所有邮件</p>
  106.        * @param flag 是否有附件的标志 true or false
  107.        */
  108.       public void setAttachFlag(boolean flag) {
  109.             try {
  110.                   SearchTerm jaterm = new JAttachTerm(flag);
  111.                   list.add(jaterm);
  112.             } catch (Exception ex) {
  113.                   System.err.println("CoffeeWebMail reportException: " + ex.toString());
  114.                   ex.printStackTrace();
  115.             }
  116.       }
  117.       /**
  118.        * Created 2004-10-09
  119.        *
  120.        * 根据给定的字符串来查找邮件正文中包含此字符串的所有邮件
  121.        * @param pattern 邮件正文要包含的字符串
  122.        */
  123.       public void setBodyText(String pattern) {
  124.             SearchTerm jbterm = new JBodyTerm(pattern);
  125.             list.add(jbterm);
  126.       }
  127.       // note: The dateFormat is <yyyy-MM-dd> eg: [2004-7-10]
  128.       public void setReceiveDate(String date) {
  129.             int comparison = getComparison();
  130.             Date recdate = null;
  131.             try {
  132.                   recdate = getSearchDate(date);
  133.                   SearchTerm recterm = new ReceivedDateTerm(comparison, recdate);
  134.                   list.add(recterm);
  135.             } catch (Exception ex) {
  136.                   System.err.println("CoffeeWebMail reportException: " + ex.toString());
  137.                   ex.printStackTrace();
  138.             }
  139.       }
  140.       public void setSentDate(String date) {
  141.             int comparison = getComparison();
  142.             Date sentdate = null;
  143.             try {
  144.                   sentdate = getSearchDate(date);
  145.                   SearchTerm recterm = new SentDateTerm(comparison, sentdate);
  146.                   list.add(recterm);
  147.             } catch (Exception ex) {
  148.                   System.err.println("CoffeeWebMail reportException: " + ex.toString());
  149.                   ex.printStackTrace();
  150.             }
  151.       }
  152.       /**
  153.        * 返回所有符合搜索条件的邮件数组
  154.        * return all messages that according the searchterm.
  155.        * param--srchmode["and" or "or"]
  156.        * @param folder Folder  要搜索的邮件夹
  157.        * @param srchmode String 搜索模式,搜索模式为其中之一: MessageQuerier.OR or MessageQuerier.AND
  158.        * @return Message[]  符合条件的所有消息数组
  159.        */
  160.       public Message[] getSrchMessages(Folder folder, String srchmode) {
  161.             SearchTerm sterm = null;
  162.             Message[] msgs = null;
  163.         //if(list.size() == 0) return null;
  164.             SearchTerm[] sterms = new SearchTerm[list.size()];
  165.             try {
  166.                   for (int i = 0; i < sterms.length; i++) {
  167.                         sterms[i] = (SearchTerm) list.get(i);
  168.                   }
  169.                   if (sterms.length > 1) {
  170.                         if (srchmode.equals("and")) {
  171.                               //debug info
  172.                               //System.out.println("and term :"+sterms.length);
  173.                               sterm = new AndTerm(sterms);
  174.                         } else if (srchmode.equals("or")) {
  175.                               sterm = new OrTerm(sterms);
  176.                         }
  177.                   } else if (sterms.length == 1) {
  178.                         //debug info
  179.                         //System.out.println("sterm's length is 1");
  180.                         sterm = sterms[0];
  181.                   }
  182.                   if (sterm == null) msgs = folder.getMessages();
  183.                   else 
  184.                 msgs = folder.search(sterm);
  185.             } catch (Exception ex) {
  186.                   System.err.println("CoffeeWebMail reportException: " + ex.toString());
  187.                   ex.printStackTrace();
  188.             }
  189.             return msgs;
  190.       }
  191.       //辅助方法
  192.       private Date getSearchDate(String date) {
  193.             String[] ymd = date.split("-");
  194.             int year, month, day;
  195.             Date srchdate = null;
  196.             try {
  197.                   year = Integer.parseInt(ymd[0]);
  198.                   month = Integer.parseInt(ymd[1]) - 1;
  199.                   day = Integer.parseInt(ymd[2]);
  200.                   Calendar cal = Calendar.getInstance();
  201.                   cal.set(year, month, day);
  202.                   srchdate = cal.getTime();
  203.             } catch (Exception ex) {
  204.                   System.err.println("CoffeeWebMail reportException: " + ex.toString());
  205.                   ex.printStackTrace();
  206.             }
  207.             return srchdate;
  208.       }
  209.       //一个测试代码
  210.       public static void main(String args[])
  211.           throws Exception {
  212.             String host = "pop.mail.yahoo.com.cn"//pop.mail.yahoo.com.cn
  213.             String username = "wwp_1124"//wwp_1124
  214.             String password = "3061643"// passwd
  215.             Properties props = new Properties();
  216.             Session session = Session.getDefaultInstance(props, null);
  217.             Store store = session.getStore("pop3");
  218.             store.connect(host, username, password);
  219.             Folder folder = store.getFolder("INBOX");
  220.             folder.open(Folder.READ_ONLY);
  221.             MessageQuerier mq = new MessageQuerier();
  222.             //mq.setAttach(true);
  223.             //mq.setAttachFlag(true);
  224.             mq.setFrom("lcd@gxsw.com");
  225.             //mq.setSubject("你好");
  226.             //mq.setBodyText("测试");
  227.             mq.setPersonal("林昌东");
  228.             Message[] msgs = mq.getSrchMessages(folder, MessageQuerier.OR);
  229.             System.out.println(msgs.length);
  230.             for (int i = 0; i < msgs.length; i++) {
  231.                   System.out.println("=====================================>");
  232.                   MimeMessageParser mmp = MimeMessageParser.getMessageParser( (MimeMessage) msgs[i]);
  233.                   System.out.println("sentDate: " + mmp.getSentDate());
  234.                   System.out.println("Subject: " + mmp.getSubject());
  235.                   System.out.println("from: " + mmp.getAddress(AddressType.FROM));
  236.                   System.out.println("personal: " + mmp.getPersonal(AddressType.FROM));
  237.                   //System.out.println("attachFlag: " + mmp.isContainAttach(msgs[i]));
  238.             }
  239.       }
  240. }


总结:
     通过看上面这段代码,相信大家已经对怎样使用JavaMail API 来进行邮件查找已经
有了一个大概的了解了吧!在上面的代码中主要是使用了自己定义的SearchTerm来进行对
邮件的查找,你可以扩展javax.mail.search包中的SearchTerm来编写属于你自己的Term
欢迎大家提出宝贵意见,我的msn是: coffeecat_1124@hotmail.com

还有就是我的代码中引用了MimeMessageParser这个类,这个类的主要作用是用来做邮件
解析的。在下一篇文章中,我会把MimeMessageParser这个类和其他用到的一些自定义
的类上传上去,希望大家可以顺利的测试程序代码,上面的文章只是给出一个思路让大
家来参考,希望是来学习思路,而不是直接套用别人的代码。
Copyright © 2002-2012 JSPCN.net. All rights reserved.
JSP中文网    备案号:粤ICP备09171188号
成都恒海科技发展有限公司    成都市一环路南二段6号新瑞楼三楼8号