pentaho/pentaho-kettle · error · KettleXMLException

Unable to load job entry of type 'get pop' from XML node

Error message

Unable to load job entry of type 'get pop' from XML node

What it means

JobEntryGetPOP.loadXML() reads all XML tags for the 'Get mail (POP3/IMAP)' job entry; a KettleXMLException raised while reading a tag is rewrapped with 'Unable to load job entry of type 'get pop' from XML node'. It means the job entry's XML in the .kjb is malformed or unreadable.

Solutions

  1. Inspect the job entry's XML block in the .kjb for well-formedness and required tags
  2. Delete and recreate the 'Get mail' job entry in Spoon, then re-save
  3. Open the job with the same or newer Pentaho version that wrote it
Defensive patterns

Strategy: validation

Validate before calling

// validate the .kjb before opening in Pentaho
xmllint --noout job.kjb && echo OK
// locate the get pop entry node and check its tags exist
grep -c 'entries/getpop\|GET_POP' job.kjb

Try / catch

try { jobMeta = JobMetaFactory.create(path, rep); } catch (KettleXMLException e) {
  log.error("Job entry XML unreadable: " + e.getMessage(), e);
  throw new IOException("Fix or recreate the get pop job entry", e);
}

Prevention

When it happens

Trigger: JobEntryGetPOP (public loadXML constructor) parsing a job entry node from a .kjb file: XMLHandler.getTagValue chain throws because the entry node is corrupted or a required sub-node is missing.

Common situations: Hand-edited or truncated .kjb, job saved by a newer Pentaho/mail plugin version and opened by an older one, interrupted save leaving partial XML.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/4ca608a460da682d. Report an issue: GitHub.

Appendix: source

Thrown at plugins/email-messages/impl/src/main/java/org/pentaho/di/job/entries/getpop/JobEntryGetPOP.java:413

      createMoveToFolder = STR_Y.equalsIgnoreCase( XMLHandler.getTagValue( entrynode, TAG_CREATE_MOVE_TO_FOLDER ) );
      createLocalFolder = STR_Y.equalsIgnoreCase( XMLHandler.getTagValue( entrynode, TAG_CREATE_LOCAL_FOLDER ) );
      aftergetimap =
        MailConnectionMeta.getAfterGetIMAPByCode( Const.NVL(
          XMLHandler.getTagValue( entrynode, TAG_AFTER_GET_IMAP ), "" ) );
      includeSubfolders = STR_Y.equalsIgnoreCase( XMLHandler.getTagValue( entrynode, TAG_INCLUDE_SUBFOLDERS ) );
      useProxy = STR_Y.equalsIgnoreCase( XMLHandler.getTagValue( entrynode, TAG_USE_PROXY ) );
      proxyUserName = XMLHandler.getTagValue( entrynode, TAG_PROXY_USER_NAME );
      setUsingAuthentication( XMLHandler.getTagValue( entrynode, TAG_USE_AUTH ) );
      setClientId( XMLHandler.getTagValue( entrynode, TAG_AUTH_CLIENT_ID ) );
      setSecretKey( Encr.decryptPasswordOptionallyEncrypted( XMLHandler.getTagValue( entrynode, TAG_AUTH_SECRET_KEY ) ) );
      setScope( XMLHandler.getTagValue( entrynode, TAG_AUTH_SCOPE ) );
      setTokenUrl( XMLHandler.getTagValue( entrynode, TAG_AUTH_TOKEN_URL ) );
      setAuthorization_code( XMLHandler.getTagValue( entrynode, TAG_AUTH_AUTHORIZATION_CODE ) );
      setRedirectUri( XMLHandler.getTagValue( entrynode, TAG_REDIRECT_URI ) );
      setRefresh_token( XMLHandler.getTagValue( entrynode, TAG_REFRESH_TOKEN ) );
      setGrant_type( XMLHandler.getTagValue( entrynode, TAG_USE_GRANT_TYPE ) );
    } catch ( KettleXMLException xe ) {
      throw new KettleXMLException( "Unable to load job entry of type 'get pop' from XML node", xe );
    }
  }

  public int getValueImapList() {
    return valueimaplist;
  }

  public void setValueImapList( int value ) {
    this.valueimaplist = value;
  }

  @Override
  public void loadRep( Repository rep, IMetaStore metaStore, ObjectId idJobEntry, List<DatabaseMeta> databases,
    List<SlaveServer> slaveServers ) throws KettleException {
    try {
      serverName = rep.getJobEntryAttributeString( idJobEntry, TAG_SERVERNAME );
      userName = rep.getJobEntryAttributeString( idJobEntry, TAG_USERNAME );
      password = Encr.decryptPasswordOptionallyEncrypted( rep.getJobEntryAttributeString( idJobEntry, TAG_PASSWORD ) );

View on GitHub (pinned to f3058517a1)