How can I interrupt IMAP's IDLE?

前端 未结 3 804
慢半拍i
慢半拍i 2021-01-12 13:44

I am using the Javamail API connecting to my IMAP server. Everything is working great with the javax.mail.Folder.idle() method. My listener gets called when a new mail comes

相关标签:
3条回答
  • 2021-01-12 14:11

    If you read the documentation properly, and read the source code, you'll realise that you have to create a new thread for calling .idle().

    Allocate that thread to a variable, and whenever you want call the interrupt() on that thread, or just ignore notifications!

    If you need to get idle() going again, just rerun the thread!

    I created something similar, so you might wanna check it out.

    https://github.com/mofirouz/JavaPushMail/blob/master/src/main/java/com/mofirouz/javapushmail/JavaPushMailAccount.java

    Good luck

    0 讨论(0)
  • 2021-01-12 14:25

    Performing any operation on that folder (from another thread) will cause idle() method to return immediately. So if you want to forcefully interrupt it, just call close() from a new thread.

    0 讨论(0)
  • 2021-01-12 14:25

    A proper way to abort IDLE command is the following snippet. Note that the Folder instance should be the same as the one used to start idling. I've tested the other solutions proposed on this thread but they didn't work in my case.

    IMAPFolder folder = store.getFolder("INBOX");
    try {
      folder.doOptionalCommand("Abort IDLE error mesage", new IMAPFolder.ProtocolCommand() {
      @Override
      public Object doCommand(IMAPProtocol p) throws ProtocolException {
        p.idleAbort();
        return Boolean.TRUE;
      }
    });
    } catch (MessagingException e) {
      e.printStackTrace();
    }
    
    0 讨论(0)
提交回复
热议问题