2015-07-10 273 views
0

我需要在我的帳戶中按日期查找一個特定的電子郵件,所以我可以獲取它的內容,但我使用的searchterm沒有完成它的工作,匹配方法只是繼續返回假和我的AsyncTask只是由於某種原因卡在該try塊,即使folder.search也應該在數以千計的電子郵件快速工作。使用javamail的searchterm通過發送日期得到一封電子郵件

代碼:

@Override 
    protected Void doInBackground(Void... params) { 
     try { 
      Properties properties = new Properties(); 
      properties.put("mail.store.protocol", "imaps"); 

      Session emailSession = Session.getDefaultInstance(properties); 
      Store store = emailSession.getStore("imaps"); 
      store.connect("imap.gmail.com", username, password); 

      // create the folder object and open it 
      Folder emailFolder = store.getFolder("INBOX"); 
      emailFolder.open(Folder.READ_WRITE); 
      SearchTerm term = new SearchTerm(){ 
       public boolean match(Message message) { 
        try { 
         if(message.getSentDate().toString().equals(emailSentDate)){ 
          return true; 
         } 
        } catch (MessagingException ex) { 
         ex.printStackTrace(); 
        } 
        return false; 
       } 
      }; 
      Message[] messages = emailFolder.search(term); 
      Object msgContent = messages[0].getContent(); 
      if (msgContent instanceof Multipart) { 

       Multipart multipart = (Multipart) msgContent; 

       Log.e("BodyPart", "MultiPartCount: " + multipart.getCount()); 

       for (int k = 0; k < multipart.getCount(); k++) { 

        BodyPart bodyPart = multipart.getBodyPart(k); 

        String disposition = bodyPart.getDisposition(); 

        if (disposition != null && (disposition.equalsIgnoreCase("ATTACHMENT"))) { 
         DataHandler handler = bodyPart.getDataHandler(); 
         content = handler.getName(); 
        } else { 
         content = bodyPart.getContent().toString(); 
        } 
       } 
      } else 
       content = messages[0].getContent().toString(); 
      emailFolder.close(false); 
      store.close(); 
     } 
     catch (NoSuchProviderException e) { 
      e.printStackTrace(); 
     } catch (MessagingException e) { 
      e.printStackTrace(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 

哪裏emailSentDate是我從以前的活動收到的字符串通過調用getSentDate()的toString()方法,有作爲。我試過SendDateTerm太多,但我真的不能實現它,因爲:

  • 我不知道那是什麼INT比較參數

  • 我不能把一個日期變量捆綁在其他活動,並且不能將字符串轉換爲Date,所以我不知道如何將正確的Date對象傳遞給它的構造函數。

我該怎麼辦?

編輯:我只想通過發送日期進行搜索,因爲我不知道UID,如果您只需要查找特定的電子郵件,請檢查this

回答

1

比較參數在javadocs描述,它表明你在做什麼類型的比較,例如,==,!=,>等

有許多方法來創建一個Date對象一個特定的日期。例如,您可以使用SimpleDateFormat對象來解析字符串並返回Date。

編寫您自己的SearchTerm會導致在客戶端上進行比較;內置的SearchTerms使用IMAP SEARCH功能在服務器上進行搜索。

確保您使用的是current version of JavaMail。日期搜索中存在一個最近已修復的錯誤。

還要注意,IMAP日期搜索只比較日期,而不是時間。

+0

再次感謝您!除日期比較之外,您還會推薦什麼,以確保每次都有正確的電子郵件地址?如果我們在同一天收到來自同一個主題的多封電子郵件,該怎麼辦?是否有某種我不知道的ID可以在for循環中比較? –

+1

好吧,我以爲你說過你想按日期找到它!也許我們需要充分滿足要求? :-)您需要了解IMAP UID(請參閱UIDFolder界面)和Message-ID標題,每個標題都可以幫助您解決問題,具體取決於您的要求。 –

+0

哇好,如果我理解它的權利,我甚至不需要一個searchterm然後,只需使用getMessagebyUID()來代替。 –