【问题标题】:Using javamail searchterm to get one email via send date使用 javamail searchterm 通过发送日期获取一封电子邮件
【发布时间】:2015-07-12 17:10:23
【问题描述】:

我需要按日期在我的帐户中找到一封特定的电子邮件,以便我可以获取其内容,但是我使用的搜索词没有完成它的工作,match 方法一直返回 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

【问题讨论】:

    标签: android jakarta-mail


    【解决方案1】:

    比较参数在javadocs中有描述,它表示你正在做的比较类型,例如,==、!=、>等。

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

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

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

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

    【讨论】:

    • 再次感谢您!除了日期比较之外,您还会推荐什么以确保我每次都收到正确的电子邮件?如果我们在一天内收到来自同一个人的多封相同主题的电子邮件怎么办?是否有某种我不知道的 ID 可以在 for 循环中进行比较?
    • 好吧,我以为你说过你想按日期找到它!也许我们需要满足您的全部要求? :-) 您需要了解 IMAP UID(请参阅 UIDFolder 界面)和 Message-ID 标头,根据您的要求,每个都可以帮助您解决问题。
    • 哇很好,如果我理解正确的话,我什至不需要搜索词,只需使用 getMessagebyUID() 代替。
    • 假设您在以其他方式发现消息后保存了 UID,并假设消息仍在同一文件夹中。
    猜你喜欢
    • 1970-01-01
    • 2012-04-19
    • 2020-10-02
    • 2017-12-18
    • 2018-12-18
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多