瘋狂

          STANDING ON THE SHOULDERS OF GIANTS
          posts - 481, comments - 486, trackbacks - 0, articles - 1
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          使用JavaMail SearchTerm 收取郵件

          Posted on 2016-02-02 16:08 瘋狂 閱讀(3424) 評(píng)論(1)  編輯  收藏

          JavaMail在javax.mail.search包中定義了一個(gè)用于創(chuàng)建搜索條件的SearchTerm類,應(yīng)用程序創(chuàng)建SearchTerm類的實(shí)例對(duì)象后,就可以調(diào)用Folder.Search(SearchTerm st)方法搜索郵件夾中符合搜索條件的所有郵件。SearchTerm是一個(gè)抽象類,JavaMail提供了22個(gè)實(shí)現(xiàn)子類以幫助應(yīng)用程序創(chuàng)建不同的搜索條件,這22個(gè)類可分為兩大類型,如下所示:

          1、用于創(chuàng)建邏輯組合關(guān)系的類

          • AND條件(AndTerm類)
          • OR條件(OrTerm類)
          • NOT條件(NotTerm類)
          • Comparison條件(ComparisonTerm類)

          2、用于創(chuàng)建具體搜索條件的類

          • DATE條件(SentDateTerm、ReceivedDateTerm類)
          • CONTENT條件(BodyTerm類)
          • HEADER條件(FromStringTerm、RecipientStringTerm、SubjectTerm類等)

          下面通過(guò)實(shí)現(xiàn)來(lái)說(shuō)明以上類的用法及含義:

          1、搜索發(fā)件人為“智聯(lián)招聘“,而且郵件正文包含“Java工程師“的所有郵件

          SearchTerm andTerm = new AndTerm( new FromStringTerm("智聯(lián)招聘"), new BodyTerm("java工程師")); Message[] messages = folder.search(andTerm); 

          2、搜索發(fā)件人為“智聯(lián)招聘“或主題包含“最新職位信息“的所有郵件

          SearchTerm orTerm = new OrTerm( new FromStringTerm("智聯(lián)招聘"), new SubjectTerm("最新職位信息")); Message[] messages = folder.search(orTerm); 

          3、搜索發(fā)件人不包含“智聯(lián)招聘“所有的郵件

          SearchTerm notTerm = new NotTerm(new FromStringTerm("智聯(lián)招聘")); Message[] messages = folder.search(notTerm); 

          4、搜索周一到今天收到的的所有郵件

          Calendar calendar = Calendar.getInstance();  
          calendar.set(Calendar.DAY_OF_WEEK, calendar.get(Calendar.DAY_OF_WEEK - (Calendar.DAY_OF_WEEK - 1)) - 1); 
          Date mondayDate = calendar.getTime(); 
          SearchTerm comparisonTermGe = new SentDateTerm(ComparisonTerm.GE, mondayDate); 
          SearchTerm comparisonTermLe = new SentDateTerm(ComparisonTerm.LE, new Date()); 
          SearchTerm comparisonAndTerm = new AndTerm(comparisonTermGe, comparisonTermLe); 
          Message[] messages = folder.search(comparisonAndTerm); 

          5、搜索大于或等100KB的所有郵件

          int mailSize = 1024 * 100; SearchTerm intComparisonTerm = new SizeTerm(IntegerComparisonTerm.GE, mailSize); 
          Message[] messages = folder.search(intComparisonTerm); 

          ComparisonTerm類常用于日期和數(shù)字比較中,它使用六個(gè)常量EQ(=)、GE(>=)、GT(>)、LE(<=)、LT(<)、NE(!=)來(lái)表示六種不同的比較操作。

          下面是完整代碼:

          import java.io.BufferedReader;   
          import java.io.InputStreamReader;   
          import java.util.Calendar;   
          import java.util.Date;   
          import java.util.Properties;   

          import javax.mail.Flags.Flag;   
          import javax.mail.Folder;   
          import javax.mail.Message;   
          import javax.mail.Session;   
          import javax.mail.Store;   
          import javax.mail.URLName;   
          import javax.mail.internet.MimeMessage;   
          import javax.mail.internet.MimeUtility;   
          import javax.mail.search.AndTerm;   
          import javax.mail.search.BodyTerm;   
          import javax.mail.search.ComparisonTerm;   
          import javax.mail.search.FromStringTerm;   
          import javax.mail.search.IntegerComparisonTerm;   
          import javax.mail.search.NotTerm;   
          import javax.mail.search.OrTerm;   
          import javax.mail.search.SearchTerm;   
          import javax.mail.search.SentDateTerm;   
          import javax.mail.search.SizeTerm;   
          import javax.mail.search.SubjectTerm;   

          /** 
           * 搜索郵件 
           
          */   
          public class SearchMailTest {   

              public static void main(String[] args) throws Exception {   
                  Properties props = new Properties();   
                  props.setProperty("mail.pop3.auth", "true");   
                  Session session = Session.getInstance(props);   
                  URLName url = new URLName("pop3", "pop3.163.com", 110, null, "xyang81@163.com", "yX546900873");   
                  Store store = session.getStore(url);   
                  store.connect();   
                  // 得到收件箱   
                  Folder folder = store.getFolder("INBOX");   
                  // 以讀寫模式打開(kāi)收件箱   
                  folder.open(Folder.READ_WRITE);   

                  Message[] messages = search(folder);   

                  System.out.println("收件箱中共有:" + folder.getMessageCount() + "封郵件,搜索到" + messages.length + "封符合條件的郵件!");   

                  // 解析郵件搜索到的郵件   
                  POP3ReceiveMailTest.parseMessage(messages);    

                  // 根據(jù)用戶輸入的條件搜索所有郵件,并提示用戶是否刪除   
                  
          //searchDemo(folder);   

                  folder.close(true);   
                  store.close();   
              }   
                       www.2cto.com  
              public static Message[] search(Folder folder) throws Exception {   
                  // 搜索主題包含美食的郵件   
                  String subject = "java培訓(xùn)";   
                  SearchTerm subjectTerm = new SubjectTerm(subject);   

                  // 搜索發(fā)件人包含支付寶的郵件   
                  SearchTerm fromTerm = new FromStringTerm("支付寶");   

                  // 搜索郵件內(nèi)容包含"招聘"的郵件   
                  SearchTerm bodyTerm = new BodyTerm("招聘");   

                  // 搜索發(fā)件人不包含“智聯(lián)招聘”的郵件   
                  SearchTerm notTerm = new NotTerm(new FromStringTerm("智聯(lián)招聘"));   

                  // 搜索發(fā)件人為“智聯(lián)招聘”,而且內(nèi)容包含“Java工程師“的郵件   
                  SearchTerm andTerm = new AndTerm(   
                          new FromStringTerm("智聯(lián)招聘"),   
                          new BodyTerm("java工程師"));   

                  // 搜索發(fā)件人為”智聯(lián)招聘“或主題包含”最新職位信息“的郵件   
                  SearchTerm orTerm = new OrTerm(   
                          new FromStringTerm("智聯(lián)招聘"),    
                          new SubjectTerm("最新職位信息"));   

                  // 搜索周一到今天收到的的所有郵件   
                  Calendar calendar = Calendar.getInstance();   
                  calendar.set(Calendar.DAY_OF_WEEK, calendar.get(Calendar.DAY_OF_WEEK - (Calendar.DAY_OF_WEEK - 1)) - 1);   
                  Date mondayDate = calendar.getTime();   
                  SearchTerm comparisonTermGe = new SentDateTerm(ComparisonTerm.GE, mondayDate);   
                  SearchTerm comparisonTermLe = new SentDateTerm(ComparisonTerm.LE, new Date());   
                  SearchTerm comparisonAndTerm = new AndTerm(comparisonTermGe, comparisonTermLe);   

                  // 搜索大于或等100KB的所有郵件   
                  int mailSize = 1024 * 100;   
                  SearchTerm intComparisonTerm = new SizeTerm(IntegerComparisonTerm.GE, mailSize);   

                  return folder.search(intComparisonTerm);   
              }   
           }   
          實(shí)例:根據(jù)用戶輸入的收件人(email地址或姓名)和主題作為搜索條件,并提示用戶是否刪除搜索到的郵件?  
          [java] view plaincopy  
          /** 
               * 根據(jù)用戶輸入的收件人地址(包括email地址和姓名)和主題作為搜索條件,并提示用戶是否刪除搜索到的郵件 
               * 
          @param from 收件人 
               * 
          @param subject 主題 
               
          */   
              public static void searchDemo(Folder folder) throws Exception {   
                  String notifyMsg = "收件箱中一共有" + folder.getMessageCount() + "封郵件。請(qǐng)選擇操作:\n";   
                  notifyMsg += "1、輸入收件人\n" + "2、輸入主題\n" + "3、開(kāi)始搜索\n" + "4、退出";   
                  System.out.println(notifyMsg);   
                  String from = null;   
                  String subject = null;   
                  BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));   
                  String oper = reader.readLine().trim();   
                  while(!(from != null && subject != null)) {   
                      if ("4".equals(oper)) {   
                          System.exit(0);   
                      } else {   
                          if ("1".equals(oper)) {   
                              System.out.print("請(qǐng)輸入收件人:");   
                              from = reader.readLine();   
                          }  else if ("2".equals(oper)) {   
                              System.out.print("請(qǐng)輸入主題:");   
                              subject = reader.readLine();   
                          } else if ("3".equals(oper)) {   
                              if (from == null || subject == null) {   
                                  System.out.println("未輸入搜索條件,無(wú)法進(jìn)行搜索!");   
                              } else {   
                                  break;   
                              }   
                          }   
                      }   
                      System.out.print("請(qǐng)選擇操作:");   
                      oper = reader.readLine().trim();   
                  }   

                  System.out.println("\n系統(tǒng)正在根據(jù)搜索條件查詢所有郵件,請(qǐng)稍候\n");   

                  // 根據(jù)輸入的條件,創(chuàng)建SearchTerm實(shí)例對(duì)象   
                  SearchTerm orTerm = new OrTerm(   
                          new FromStringTerm(from),   
                          new SubjectTerm(subject)   
                          );   

                  // 根據(jù)搜索條件得到搜索到的郵件列表   
                  Message[] messages = folder.search(orTerm);   

                  System.out.println("共搜索到" + messages.length + "封滿足搜索條件的郵件!\n\n請(qǐng)選擇操作:1、查看郵件\t 2、刪除所有郵件");   

                  String deleteQuestion = "是否要?jiǎng)h除搜索到的郵件?(yes/no)";   

                  String searchResultOper = reader.readLine();   

                  if ("1".equals(searchResultOper)) {   
                      for (Message message : messages) {   
                          MimeMessage msg = (MimeMessage) message;   
                          String sub = POP3ReceiveMailTest.getSubject(msg);   
                          System.out.println("開(kāi)始查看第" + msg.getMessageNumber() + "封郵件");   
                          System.out.println("主題: " + sub);   
                          System.out.println("發(fā)件人: " + POP3ReceiveMailTest.getFrom(msg));   
                          System.out.println("收件人:" + POP3ReceiveMailTest.getReceiveAddress(msg, null));   
                          System.out.println("發(fā)送時(shí)間:" + POP3ReceiveMailTest.getSentDate(msg, null));   
                          System.out.println(deleteQuestion);   
                          String answer = reader.readLine();   
                          if ("yes".equals(answer)) {   
                              msg.setFlag(Flag.DELETED, true);   
                              System.out.println("郵件[" + sub + "]刪除成功!");   
                          } else if ("no".equals(answer)) {   
                              System.out.println("第" + msg.getMessageNumber() + "封郵件查看完成!");   
                          } else if ("stop".equals(answer)) {   
                              System.exit(0);   
                          }   
                          System.out.println();   
                      }   
                  } else {   
                      System.out.println(deleteQuestion);   
                      String answer = reader.readLine();   
                      if ("yes".equals(answer)) {   
                          for (Message message : messages) {   
                              String sub = MimeUtility.decodeText(message.getSubject());   
                              message.setFlag(Flag.DELETED, true);   
                              System.out.println("郵件[" + sub + "]刪除成功!");   
                          }   
                      }   
                  }   
              }
          }

          評(píng)論

          # re: 使用JavaMail SearchTerm 收取郵件  回復(fù)  更多評(píng)論   

          2016-03-13 20:49 by 淘寶刷流量軟件
          感謝分享!!

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 延寿县| 临朐县| 财经| 吴桥县| 黄浦区| 吴旗县| 开化县| 石狮市| 永登县| 洛浦县| 台州市| 新巴尔虎右旗| 海盐县| 建德市| 宁晋县| 金塔县| 格尔木市| 大理市| 来凤县| 睢宁县| 塘沽区| 新津县| 萍乡市| 民乐县| 益阳市| 鄂州市| 高要市| 玛纳斯县| 井冈山市| 南宫市| 沂南县| 比如县| 峨山| 英山县| 贵定县| 肃北| 唐山市| 石景山区| 嘉善县| 黑山县| 即墨市|