使用javamail searchterm通过发送日期获取一封电子邮件

时间:2015-07-10 09:46:00

标签: android javamail

我需要按日期在我的帐户中找到一个特定的电子邮件,因此我可以获取其内容,但我使用的searchterm没有完成其工作,匹配方法只是保持返回false并且我的AsyncTask只是停留在try块中出于某种原因,即使folder.search也应该在成千上万的电子邮件中快速工作。

代码:

@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,所以我不知道如何将正确的Date对象传递给它构造

我该怎么办?

编辑:我只想通过发送日期进行搜索,因为我不了解UID,如果您只是需要查找特定的电子邮件,请查看this

1 个答案:

答案 0 :(得分:1)

比较参数在javadocs中描述,它表示您正在进行的比较类型,例如==,!=,&gt;等。

有很多方法可以为特定日期创建Date对象。例如,您可以使用SimpleDateFormat对象来解析字符串并返回日期。

编写自己的SearchTerm会导致在客户端上进行比较;内置的SearchTerms使用IMAP SEARCH功能在服务器上进行搜索。

确保您使用的是current version of JavaMail。日期搜索中存在最近修复的错误。

另请注意,IMAP日期搜索仅比较日期,而不是时间。