{"record":{"id":"75874b28988b2f6a","repo":"pentaho/pentaho-kettle","slug":"mailconnection-error-deletingmessage","errorCode":null,"errorMessage":"MailConnection.Error.DeletingMessage","messagePattern":"MailConnection\\.Error\\.DeletingMessage","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":1078,"sourceCode":"      retval = ( matcher.matches() );\n    }\n    return retval;\n  }\n\n  /**\n   * Delete current fetched message\n   *\n   * @throws KettleException\n   */\n  public void deleteMessage() throws KettleException {\n    try {\n      this.message.setFlag( Flags.Flag.DELETED, true );\n      updateDeletedMessagesCounter();\n      if ( this.protocol == MailConnectionMeta.PROTOCOL_MBOX ) {\n        this.messages = this.mboxMessages;\n      }\n    } catch ( Exception e ) {\n      throw new KettleException( BaseMessages.getString( PKG, \"MailConnection.Error.DeletingMessage\", \"\"\n        + getEffectiveMessageNumber( getMessage() ) ), e );\n    }\n  }\n\n  /**\n   * Set destination folder\n   *\n   * @param foldername\n   *          destination foldername\n   * @param createFolder\n   *          flag create folder if needed\n   * @throws KettleException\n   */\n  public void setDestinationFolder( String foldername, boolean createFolder ) throws KettleException {\n    try {\n      if ( this.protocol == MailConnectionMeta.PROTOCOL_MBOX ) {\n        this.destinationMboxPath = prepareMboxDestinationPath( foldername, createFolder );\n        return;","sourceCodeStart":1060,"sourceCodeEnd":1096,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/email-messages/impl/src/main/java/org/pentaho/di/job/entries/getpop/MailConnection.java#L1060-L1096","documentation":"MailConnection.deleteMessage() wraps any exception raised while flagging the current javax.mail Message with Flags.Flag.DELETED into a KettleException with message key MailConnection.Error.DeletingMessage, including the effective message number. It is thrown when the underlying mail store (IMAP/POP/MBOX) refuses or fails the delete operation. The original cause is attached, so the JavaMail exception is the real diagnostic.","triggerScenarios":"Calling MailConnection.deleteMessage() after fetchNext() when message.setFlag(Flags.Flag.DELETED, true) throws — e.g. folder not open READ_WRITE, the message was expunged server-side, or the MBOX file is not writable.","commonSituations":"IMAP folder opened read-only so the DELETED flag is rejected; POP3 servers that do not support server-side flags; the message was already deleted by another client; permissions problems writing the MBOX file.","solutions":["Open the IMAP folder in READ_WRITE mode before deleting messages (folder.open(Folder.READ_WRITE)).","Read the wrapped cause 'e' in the KettleException to identify the underlying JavaMail failure.","Re-fetch the message list if the message was expunged, then retry the delete.","For MBOX protocol, verify the mbox file and its parent directory are writable by the Pentaho process user."],"exampleFix":"// before\nconnection.setPopupFolder(\"INBOX\");\nconnection.fetchNext();\nconnection.deleteMessage(); // fails: folder read-only\n// after\nconnection.setPopupFolder(\"INBOX\");\n// ensure the folder was opened READ_WRITE by MailConnection before fetching\nconnection.fetchNext();\ntry {\n  connection.deleteMessage();\n} catch (KettleException e) {\n  logError(\"Delete failed for message: \" + e.getMessage(), e);\n}","handlingStrategy":"try-catch","validationCode":"if (folder.getMode() != Folder.READ_WRITE) { throw new IllegalStateException(\"Folder must be opened READ_WRITE to delete messages\"); }","typeGuard":"if (connection.getMessage() == null) return false; // no current message to delete","tryCatchPattern":"try { connection.deleteMessage(); } catch (KettleException e) { logError(\"Delete failed: \" + e.getCause(), e); }","preventionTips":["Always open IMAP folders READ_WRITE when deletes are planned","Check the folder supports Flags.Flag.DELETED for the protocol","Handle expunged messages by refreshing the message list before retries"],"tags":["javamail","imap","message-delete","kettle"],"backgroundTag":"api-error-response","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"}