code: @Override
    public synchronized void disconnect() {
      try {
        // If there is an error with the handler, dont bother logging out.
        if (!mailClientHandler.isHalted()) {
          if (mailClientHandler.idleRequested.get()) {
            log.warn("Disconnect called while IDLE, leaving idle and logging out.");
            done();
          }
  
          // Log out of the IMAP Server.
          channel.write(". logout\n");
        }
  
        currentFolder = null;
      } catch (Exception e) {
        // swallow any exceptions.
      } finally {
        // Shut down all channels and exit (leave threadpools as is--for reconnects).
        // The Netty channel close listener will fire a disconnect event to our client,
        // automatically. See connect() for details.
        try {
          channel.close().awaitUninterruptibly(config.getTimeout(), TimeUnit.MILLISECONDS);
        } catch (Exception e) {
          // swallow any exceptions.
        } finally {
          mailClientHandler.idleAcknowledged.set(false);
          mailClientHandler.disconnected();
          if (disconnectListener != null)
            disconnectListener.disconnected();
        }
      }
    }
docs: Logs out of the current IMAP session and releases all resources, including
  executor services.