Javamail IMAP 在特定日期时间内检索最新的电子邮件

Javamail IMAP retrieve latest emails within specific datetime

我对 javamail 的使用感到困惑。我需要时不时从邮件服务器上下载最新的邮件,但是javamail好像不能查询到时分秒内的具体邮件,只有一天可以吗?

(1) 我是否应该扫描所有 return 封电子邮件以进一步检查是否在时间间隔内?还是我做错了什么?

(2) 我是否应该假设电子邮件按接收日期升序排列并安全地忽略电子邮件的顶部(假设以前的已经检索)

(3) 有推荐的扫描间隔吗?如果与邮件客户端相比呢?

private void retrieveEmailsWithinDateInterval() throws ParseException, MessagingException{
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    Calendar c = Calendar.getInstance();
    c.setTime(new Date());
    c.add(Calendar.DATE, 1);

    //Retrieval of email setting
    Date previousDate = sdf.parse("2018-02-13");
    Date tmrDate = new Date(c.getTimeInMillis());
    String imapHost = "***";
    int port = 587;
    String urlNameStr = "***";
    String emailAddr = "***";
    String emailPass = "***";
    String inboxFolderName = "***";

    Properties props           = System.getProperties();

    props.setProperty("mail.imap.host", imapHost);
    props.setProperty("mail.imap.port", Integer.toString(port));
    props.setProperty("mail.store.protocol", "imap");

    Session session = Session.getDefaultInstance(props, null);
    URLName urlName = new URLName(urlNameStr);
    Store   store   = session.getStore(urlName);

    store.connect(imapHost, emailAddr, emailPass);

    ReceivedDateTerm       minDateTerm = new ReceivedDateTerm(ComparisonTerm.GT, previousDate);
    ReceivedDateTerm       maxDateTerm = new ReceivedDateTerm(ComparisonTerm.LT, tmrDate);
    SearchTerm searchTerm = new AndTerm(minDateTerm, maxDateTerm); 

    IMAPFolder inboxFolder = (IMAPFolder) store.getFolder(inboxFolderName);

    if(!inboxFolder.isOpen())
        inboxFolder.open(Folder.READ_ONLY);

    Message[] messagesInbox = inboxFolder.search(searchTerm);

    for (Message msg : messagesInbox){
        //(1) Should I extra check or alternative solution? 
        //Seem it compare date only and ignore hour, minute and second.
        if (msg.getReceivedDate().getTime() <= previousDate.getTime())
            continue;
        //(2) Should I scan through email messages? 
        //Or will all mail server sort in receivedDate, that I can safely ignore top messages or bottom messages?

        processEmailWithinDatetimeInterval(msg);
    }

    if ((inboxFolder != null) && inboxFolder.isOpen()) {
        inboxFolder.close(true);
    }
    if (store != null) {
        store.close();
    }
}

IMAP 协议的限制,您只能按天搜索,不能按时间搜索。

如果您只是想在您的收件箱中查找您以前没有看到的最新邮件,您可以keep track of the UID of the last message you've seen and then ask for messages with larger UIDs,例如

Message[] newMessages = ((UIDFolder)folder).getMessagesByUID(lastSeen + 1, UIDFolder.MAXUID);