【问题标题】:java imap fetch messages since a datejava imap 获取自某个日期以来的消息
【发布时间】:2010-10-26 14:00:37
【问题描述】:

我正在编写/学习使用 javax.mail 包从 IMAP 文件夹中使用 java 获取电子邮件。我成功地检索了文件夹中的最后 n 条消息,但是我希望构建一个示例来检索自指定日期以来的消息。有什么例子吗?

【问题讨论】:

标签: java email imap


【解决方案1】:

这是我想出的。这对我有用,但可能不是最好的方法。有什么改进的建议吗?

      Date from; //assume initialized
      Store store; //assume initialized
      Folder inbox = store.getFolder("INBOX");
      inbox.open(Folder.READ_ONLY);
      int end = inbox.getMessageCount();
      long lFrom = from.getTime();
      Date rDate;
      long lrDate;
      int start = end;
      do {
        start = start - 10;
        Message testMsg = inbox.getMessage(start);
        rDate = testMsg.getReceivedDate();
        lrDate = rDate.getTime();
      } while (lrDate > lFrom);
      Message msg[] = inbox.getMessages(start, end);
      for (int i=0, n=msg.length; i<n; i++) {
        lrDate = msg[i].getReceivedDate().getTime();
        if (lrDate > lFrom) {
          System.out.println(i + ": "
            + msg[i].getFrom()[0]
            + "\t" + msg[i].getSubject());
        }
      }

【讨论】:

  • 绝对不是一个好方法,因为它首先获取电子邮件而不使用 IMAP 功能过滤它们。我相信十倍的增量并没有让它变得更好(想象一下盒子里有 10k 封电子邮件)
【解决方案2】:

您应该尝试利用服务器端搜索,而不是获取所有消息。 这通过使用 javax.mail.Foldersearch 方法来工作。您可能必须根据 Message.getReceivedDate() 上的条件编写自己的 SearchTerm。

如果服务器端搜索不起作用,您可以尝试使用提取配置文件,即使用 inbox.fetch(Message[] msgs, FetchProfile fp) 代替 inbox.getMessages()。 fetch 的 javadoc 说:客户端使用此方法来指示指定的项目需要为给定的消息范围整体。期望实现以有效的方式检索给定消息范围的这些项目。请注意,此方法只是实现预取所需项目的提示。

【讨论】:

    【解决方案3】:

    您还可以使用 java 邮件包中的 SearchTerm 类。

    SearchTerm olderThan = new ReceivedDateTerm(ComparisonTerm.LT, someFutureDate);
    SearchTerm newerThan = new ReceivedDateTerm(ComparisonTerm.GT, somePastDate);
    SearchTerm andTerm = new AndTerm(olderThan, newerThan);
    inbox.search(andTerm);
    

    以上的一些组合应该被证明是获取特定范围内日期的更好方法。

    【讨论】:

    • 我正在尝试使用 receivedDateTerm,但似乎没有返回正确的结果。我只想检索过去 1 分钟内收到的所有邮件或从我的测试开始时收到的所有邮件。它没有按预期工作..这就是我正在做的事情。 SearchTerm st = new AndTerm(new SubjectTerm(subjectSearchPhrase), new BodyTerm(bodySearchPhrases)); st = new AndTerm(st, new ReceivedDateTerm(ComparisonTerm.GE, searchMailReceivedDateGE)); 我也尝试过使用YoungerTerm(80),但这也不起作用。有人知道这个问题吗?谢谢!
    • 需要注意的一点:IMAP 只能按状态搜索,不能按时间搜索,所以如果想要获取自上次更新以来的所有新邮件,他们需要将比较日期的时间设置回到午夜,并进一步检查客户端上的重复项。
    【解决方案4】:
    public class CheckDate  {
        public void myCheckDate(Date givenDate) {
            SearchTerm st = new ReceivedDateTerm(ComparisonTerm.EQ,givenDate);
    
            Message[] messages = inbox.search(st);
        }
    
        // in main method
    
        public static void main(String[] args) throws ParseException{
            SimpleDateFormat df1 = new SimpleDateFormat( "MM/dd/yy" );
            String dt="06/23/10";
            java.util.Date dDate = df1.parse(dt);
            cd.myCheckDate(dDate);
        }
    }
    

    【讨论】:

      【解决方案5】:

      上个月的所有邮件:

          Calendar cal = Calendar.getInstance();
          cal.roll(Calendar.MONTH, false);
          Message[] search = folder.search(new ReceivedDateTerm(ComparisonTerm.GT, cal.getTime()));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-05
        • 2018-01-11
        • 2012-01-04
        相关资源
        最近更新 更多