2015-07-10 276 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()来代替。 –