{"record":{"id":"b7a0eec90d8456a4","repo":"pentaho/pentaho-kettle","slug":"jobgetmailsfrompop-error-closingfolder","errorCode":null,"errorMessage":"JobGetMailsFromPOP.Error.ClosingFolder","messagePattern":"JobGetMailsFromPOP\\.Error\\.ClosingFolder","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"plugins/email-messages/impl/src/main/java/org/pentaho/di/job/entries/getpop/MailConnection.java","lineNumber":604,"sourceCode":"   * @throws KettleException\n   */\n  public void closeFolder( boolean expunge ) throws KettleException {\n    try {\n      if ( this.folder != null && this.folder.isOpen() ) {\n        if ( log.isDebug() ) {\n          log.logDebug( BaseMessages.getString( PKG, \"MailConnection.ClosingFolder\", getFolderName() ) );\n        }\n        this.folder.close( expunge );\n        this.folder = null;\n        this.messages = null;\n        this.message = null;\n        this.messagenr = -1;\n        if ( log.isDebug() ) {\n          log.logDebug( BaseMessages.getString( PKG, \"MailConnection.FolderClosed\", getFolderName() ) );\n        }\n      }\n    } catch ( Exception e ) {\n      throw new KettleException( BaseMessages.getString(\n        PKG, \"JobGetMailsFromPOP.Error.ClosingFolder\", getFolderName() ), e );\n    }\n  }\n\n  /**\n   * Add search term.\n   *\n   * @param term\n   *          search term to add\n   */\n  private void addSearchTerm( SearchTerm term ) {\n    if ( this.searchTerm != null ) {\n      this.searchTerm = new AndTerm( this.searchTerm, term );\n    } else {\n      this.searchTerm = term;\n    }\n  }\n","sourceCodeStart":586,"sourceCodeEnd":622,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/email-messages/impl/src/main/java/org/pentaho/di/job/entries/getpop/MailConnection.java#L586-L622","documentation":"closeFolder() wraps exceptions from closing the current folder (folder.close(false/true), expunging included) into a KettleException with JobGetMailsFromPOP.Error.ClosingFolder and the folder name. Called from openFolder (reopen path) and disconnect, so it can mask an earlier problem during cleanup.","triggerScenarios":"closeFolder() when the store connection dropped mid-session (network loss, server timeout), or the folder was already closed/expunged, or an expunge write fails in read-write mode.","commonSituations":"Long-running jobs whose IMAP session timed out before close; server forcibly disconnecting after 'delete messages' operations; calling disconnect twice.","solutions":["Check the chained cause — usually a_FOLDER_CLOSED/Connection dropped exception; fix network stability or increase server timeout.","Avoid expunging on close if the connection is flaky (don't delete messages, or expunge explicitly earlier).","Guard double-close: only call closeFolder/disconnect once per connection lifecycle.","Reconnect before retrying operations if the session timed out."],"exampleFix":"// before\ncloseFolder();\ndisconnect();\ndisconnect(); // second close throws\n// after\ncloseFolder();\ndisconnect(); // disconnect() is idempotent internally — don't call cleanup twice","handlingStrategy":"try-catch","validationCode":"// before close, confirm session is alive\nif (!mailConnection.getStore().isConnected()) {\n  log.logBasic(\"Store already disconnected; skipping folder close\");\n}","typeGuard":null,"tryCatchPattern":"try {\n  mailConnection.closeFolder();\n} catch (KettleException e) {\n  log.logBasic(\"Folder close failed (session likely dropped): \" + e.getCause().getMessage());\n}","preventionTips":["Keep job runtime under the server idle timeout","Close folders/disconnect in finally blocks exactly once","Avoid expunge on close for flaky connections","Monitor IMAP session logs for forced logouts"],"tags":["javamail","imap","folder","session-timeout","kettle"],"backgroundTag":"invalid-state-transition","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}