Imap idle(false)不会收到所有电子邮件

时间:2013-02-25 11:56:15

标签: java imap javamail

我尝试使用sun IMAPFolder和idle命令实现一个邮件服务器来解析传感器发送的电子邮件。

不幸的是,空闲状态在30分钟后关闭并抛出FolderClosedException。为了模拟在重新启动空闲时电子邮件到达的最坏情况,我会在异常正文中发送测试电子邮件,看看是否处理了电子邮件。

我的代码:

public void run() {
    try {
        Properties props = System.getProperties();
        props.setProperty("mail.imap.connectiontimeout", "5000");
        props.setProperty("mail.imap.timeout", "5000");



        for(;;) {
            try {
                Session session = Session.getInstance(props, null);
                Store store = session.getStore("imap");
                store.connect("localhost", "test@email.db.de", "testpw1");
                Folder folder = store.getFolder("inbox");

                if ((folder == null) || !folder.exists()) {
                    logger.error("folder -inbox- is invalid.");
                    return;
                }

                folder.open(Folder.READ_WRITE);

                // Add messageCountListener to listen for new messages
                folder.addMessageCountListener(new MessageCountAdapter() {
                    @Override
                    public void messagesAdded(MessageCountEvent event) {
                        Message[] messages = event.getMessages();
                        processMessages(messages);                  
                    }               
                });     

                logger.debug("idle start");
                IMAPFolder f = (IMAPFolder) folder;
                f.idle();   //idle state

            } catch (FolderClosedException ex) {
                logger.info("idle timeout");
                long time = Calendar.getInstance().getTimeInMillis();
                DateFormat df = DateFormat.getDateTimeInstance();
                SendEmail.send("test@email.db.de", "TestSubject", "This mail is sent when idle is off" + df.format(new Date(time));
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }//endfor

    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

不幸的是,我得到两个不同的输出,我不知道为什么。

有时会处理电子邮件:

02/25/2013 11:45:04.202 DEBUG [Thread-0]    logger     - idle start
02/25/2013 12:15:04.202 INFO  [Thread-0]    logger     - idle timeout
This mail is sent when idle is off 25.02.2013 12:15:04
02/25/2013 12:15:04.235 DEBUG [Thread-0]    logger     - idle start
Got 1 new messages
02/25/2013 12:15:04.267 DEBUG [Thread-0]    logger     - idle start

有时不是:

02/25/2013 10:41:28.895 DEBUG [Thread-0]    logger     - idle start
02/25/2013 11:11:28.898 INFO  [Thread-0]    logger     - idle timeout
This mail is sent when idle is off 25.02.2013 11:11:28
02/25/2013 11:11:28.962 DEBUG [Thread-0]    logger     - idle start

我的目标是不再抛出folderClosedException,或者始终处理catch主体中的电子邮件。

我怎样才能做到这一点? 为什么我在这里有两种类型的输出?

提前致谢。

1 个答案:

答案 0 :(得分:1)

IDLE仅持续30分钟。之后,远程服务器可以关闭您的TCP连接。连接关闭后,您将看不到新电子邮件。 (但是通过比较EXISTS计数和UID,你应该能够在重新连接时拿起它。)

更好的做法是在大约29分钟时打破IDLE并在服务器关闭TCP连接之前重新建立IDLE。

您仍然应该处理连接中断,因为这些可能由于多种原因而发生。