細心!用心!耐心!

          吾非文人,乃市井一俗人也,讀百卷書,跨江河千里,故申城一游; 一兩滴辛酸,三四年學業,五六點粗墨,七八筆買賣,九十道人情。

          BlogJava 聯系 聚合 管理
            1 Posts :: 196 Stories :: 10 Comments :: 0 Trackbacks

          用javaMail實現對郵件的查找

           

          用javaMail來實現郵件的查找非常的容易,我把自己平時的經驗總結成如下這篇文章,希望對大家能有幫助,同時也希望各位能給
          如下程序多提一些自己的看法:

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


          package webmail.mail.search;


          import javax.mail.*;
          import java.util.Iterator;
          import java.util.Date;
          import java.util.HashSet;
          import java.util.ArrayList;
          import java.util.Calendar;
          import java.util.Properties;
          import javax.mail.internet.*;
          import javax.mail.search.*;

          import webmail.mail.search.PersonalTerm;
          import webmail.mail.search.JAttachTerm;
          import webmail.mail.search.JBodyTerm;

          import webmail.mail.*;
          import webmail.mail.MimeMessageParser;

          /**
           * description: 一個簡單的郵件查找類,用來查找特定主題的郵件,特定日期,或者
           * 是包含有附件的郵件
           * lastmodify: 2004-10-09
           * <p>注: JavaMail API中的javax.mail.search包中的BodyTerm和AttachTerm在使用時
           * 有問題,這里使用我擴展SearchTerm的JBodyTerm和JAttachTerm,同時由于javax.
           * mail.search包中的SubjectTerm取郵件主題直接調用JavaMail的getSubject()方法
           * 這樣得到的結果有時候不正常,可以擴展SearchTerm來定義自己的Term(這個是下
           * 一篇文章要寫的內容)
           * @author wang weiping of BeiJing flow.Inc
           * @version v1.0.1
           */
          public class MessageQuerier {

                private String body = "";
                private ArrayList list = new ArrayList();
                private int comparison = ComparisonTerm.EQ;

                public static final String OR = "or";
                public static final String AND = "and";
               
                //默認構造方法
                public MessageQuerier() {}

                public void setComparison(String string) {
                      if (string.equals(">")) {
                            comparison = ComparisonTerm.GE;
                      } else if (string.equals("<")) {
                            comparison = ComparisonTerm.LE;
                      }
                }

                public int getComparison() {
                      return this.comparison;
                }

                /**
                 * 根據指定的字符串來查找所有郵件主題中包含此字符串的所有郵件
                 * @param subject 郵件主題中所要包含的字符串
                 */
                public void setSubject(String subject) {
                      SearchTerm subterm = new JSubjectTerm(subject);
                      list.add(subterm);
                }
               
                public void setRecipients(String recipients){
                      try{
                            SearchTerm rterm = new RecipientTerm   (Message.RecipientType.TO,new InternetAddress(recipients));
                            list.add(rterm);
                      }catch(Exception ex){
                            //ignore exception
                            ex.printStackTrace();
                      }
                }
               
                public void setRecipientPersons(String recipientPersons){
                      SearchTerm rpTerm = new RecipientPersonTerm(recipientPersons);
                      list.add(rpTerm);
                }
               
                /**
                 * 根據指定的字符串來查找發件人地址中包含此字符串的所有郵件
                 * @param from 設置發件人地址中要包含的字符串
                 */
                public void setFrom(String from) {
                      try {
                            SearchTerm fterm = new FromTerm(new InternetAddress(from));
                            list.add(fterm);
                      } catch (Exception ex) {
                            System.err.println("CoffeeWebMail reportException: " + ex.toString());
                            ex.printStackTrace();
                      }
                }

                /**
                 * Created 2004-10-9
                 * 此類用了自定義的查找器PersonalTerm,此類從javax.mail.search.StringTerm
                 * 中繼承下來,重寫了StringTerm類的match()方法
                 * <p>根據發件人的姓名來查找此發件人發來的所有郵件</p>
                 * @param personal 設置發件人的姓名
                 */
                public void setPersonal(String personal) {
                      try {
                            PersonalTerm pterm = new PersonalTerm(personal);
                            list.add(pterm);
                      } catch (Exception ex) {
                            System.err.println("CoffeeWebMail reportException: " + ex.toString());
                            ex.printStackTrace();
                      }
                }

                /**
                 * Created 2004-10-09
                 *
                 * 此類用到了自定義的查找器JAttachTerm,此類從javax.mail.search.SearchTerm中
                 * 直接繼承下來,重寫了SearchTerm類的match()方法
                 * <p>根據是否包含附件來查找匹配的所有郵件</p>
                 * @param flag 是否有附件的標志 true or false
                 */
                public void setAttachFlag(boolean flag) {
                      try {
                            SearchTerm jaterm = new JAttachTerm(flag);
                            list.add(jaterm);
                      } catch (Exception ex) {
                            System.err.println("CoffeeWebMail reportException: " + ex.toString());
                            ex.printStackTrace();
                      }
                }


                /**
                 * Created 2004-10-09
                 *
                 * 根據給定的字符串來查找郵件正文中包含此字符串的所有郵件
                 * @param pattern 郵件正文要包含的字符串
                 */
                public void setBodyText(String pattern) {
                      SearchTerm jbterm = new JBodyTerm(pattern);
                      list.add(jbterm);
                }


                // note: The dateFormat is <yyyy-MM-dd> eg: [2004-7-10]
                public void setReceiveDate(String date) {
                      int comparison = getComparison();
                      Date recdate = null;
                      try {
                            recdate = getSearchDate(date);
                            SearchTerm recterm = new ReceivedDateTerm(comparison, recdate);
                            list.add(recterm);
                      } catch (Exception ex) {
                            System.err.println("CoffeeWebMail reportException: " + ex.toString());
                            ex.printStackTrace();
                      }
                }

                public void setSentDate(String date) {
                      int comparison = getComparison();
                      Date sentdate = null;
                      try {
                            sentdate = getSearchDate(date);
                            SearchTerm recterm = new SentDateTerm(comparison, sentdate);
                            list.add(recterm);
                      } catch (Exception ex) {
                            System.err.println("CoffeeWebMail reportException: " + ex.toString());
                            ex.printStackTrace();
                      }
                }

                /**
                 * 返回所有符合搜索條件的郵件數組
                 * return all messages that according the searchterm.
                 * param--srchmode["and" or "or"]
                 * @param folder Folder  要搜索的郵件夾
                 * @param srchmode String 搜索模式,搜索模式為其中之一: MessageQuerier.OR or MessageQuerier.AND
                 * @return Message[]  符合條件的所有消息數組
                 */
                public Message[] getSrchMessages(Folder folder, String srchmode) {
                      SearchTerm sterm = null;
                      Message[] msgs = null;
                  //if(list.size() == 0) return null;
                      SearchTerm[] sterms = new SearchTerm[list.size()];
                      try {
                            for (int i = 0; i < sterms.length; i++) {
                                  sterms[i] = (SearchTerm) list.get(i);
                            }
                            if (sterms.length > 1) {
                                  if (srchmode.equals("and")) {
                                        //debug info
                                        //System.out.println("and term :"+sterms.length);
                                        sterm = new AndTerm(sterms);
                                  } else if (srchmode.equals("or")) {
                                        sterm = new OrTerm(sterms);
                                  }
                            } else if (sterms.length == 1) {
                                  //debug info
                                  //System.out.println("sterm's length is 1");
                                  sterm = sterms[0];
                            }
                            if (sterm == null) msgs = folder.getMessages();
                            else
                          msgs = folder.search(sterm);

                      } catch (Exception ex) {
                            System.err.println("CoffeeWebMail reportException: " + ex.toString());
                            ex.printStackTrace();
                      }
                      return msgs;
                }

                //輔助方法
                private Date getSearchDate(String date) {
                      String[] ymd = date.split("-");
                      int year, month, day;
                      Date srchdate = null;
                      try {
                            year = Integer.parseInt(ymd[0]);
                            month = Integer.parseInt(ymd[1]) - 1;
                            day = Integer.parseInt(ymd[2]);
                            Calendar cal = Calendar.getInstance();
                            cal.set(year, month, day);
                            srchdate = cal.getTime();
                      } catch (Exception ex) {
                            System.err.println("CoffeeWebMail reportException: " + ex.toString());
                            ex.printStackTrace();
                      }
                      return srchdate;
                }

                //一個測試代碼
                public static void main(String args[])
                    throws Exception {
                      String host = "pop.mail.yahoo.com.cn"; //pop.mail.yahoo.com.cn
                      String username = "wwp_1124"; //wwp_1124
                      String password = "3061643"; // passwd
                      Properties props = new Properties();
                      Session session = Session.getDefaultInstance(props, null);
                      Store store = session.getStore("pop3");
                      store.connect(host, username, password);
                      Folder folder = store.getFolder("INBOX");
                      folder.open(Folder.READ_ONLY);
                      MessageQuerier mq = new MessageQuerier();
                      //mq.setAttach(true);
                      //mq.setAttachFlag(true);
                      mq.setFrom("lcd@gxsw.com");
                      //mq.setSubject("你好");
                      //mq.setBodyText("測試");
                      mq.setPersonal("林昌東");
                      Message[] msgs = mq.getSrchMessages(folder, MessageQuerier.OR);
                      System.out.println(msgs.length);
                      for (int i = 0; i < msgs.length; i++) {
                            System.out.println("=====================================>");
                            MimeMessageParser mmp = MimeMessageParser.getMessageParser( (MimeMessage) msgs[i]);
                            System.out.println("sentDate: " + mmp.getSentDate());
                            System.out.println("Subject: " + mmp.getSubject());
                            System.out.println("from: " + mmp.getAddress(AddressType.FROM));
                            System.out.println("personal: " + mmp.getPersonal(AddressType.FROM));
                            //System.out.println("attachFlag: " + mmp.isContainAttach(msgs[i]));
                      }
                }
          }


          總結:
               通過看上面這段代碼,相信大家已經對怎樣使用JavaMail API 來進行郵件查找已經
          有了一個大概的了解了吧!在上面的代碼中主要是使用了自己定義的SearchTerm來進行對
          郵件的查找,你可以擴展javax.mail.search包中的SearchTerm來編寫屬于你自己的Term
          歡迎大家提出寶貴意見,我的msn是: coffeecat_1124@hotmail.com

          還有就是我的代碼中引用了MimeMessageParser這個類,這個類的主要作用是用來做郵件
          解析的。在下一篇文章中,我會把MimeMessageParser這個類和其他用到的一些自定義
          的類上傳上去,希望大家可以順利的測試程序代碼,上面的文章只是給出一個思路讓大
          家來參考,希望是來學習思路,而不是直接套用別人的代碼。

          posted on 2007-05-06 12:05 張金鵬 閱讀(364) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 阳高县| 油尖旺区| 余庆县| 谷城县| 沁源县| 上高县| 唐山市| 宽甸| 剑河县| 淮南市| 牙克石市| 镇雄县| 弋阳县| 略阳县| 双峰县| 巴马| 夏津县| 望谟县| 启东市| 元阳县| 武川县| 巢湖市| 思南县| 当雄县| 锦屏县| 祁连县| 特克斯县| 崇文区| 平泉县| 吉林省| 阜康市| 沾益县| 鹰潭市| 九江市| 军事| 敦煌市| 天等县| 武宁县| 吕梁市| 安乡县| 沁源县|