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
- Inspect the job entry's XML block in the .kjb for well-formedness and required tags
- Delete and recreate the 'Get mail' job entry in Spoon, then re-save
- 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
- Avoid manual edits to .kjb files; use Spoon
- Match Pentaho/mail plugin versions between authoring and execution environments
- Commit jobs to VCS to recover from truncated saves
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
- ERROR_0001_Cannot_Load_Job_Entry_From_Xml_Node
- ERROR_0001
- JobDosToUnix.Error.Exception.UnableLoadXML
- JobEntryAbort.UnableToLoadFromXml.Label
- JobEntryAddResultFilenames.UnableToLoadFromXml
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)