pentaho/pentaho-kettle · error · KettleException
MailValidator.Error.EMailNotValidMsgMissing
Error message
MailValidator.Error.EMailNotValidMsgMissing
What it means
MailValidator.processRow() throws this KettleException when the step returns its result as a string but the 'not valid email message' (EMailNotValideMsg) is empty. That message is written to the result field for failed validations and is required in string-output mode.
Solutions
- Open the Mail Validator step dialog and set the 'not valid email message' (e.g. 'BAD').
- Disable 'result as string' if boolean output suffices.
- Set it in code: meta.setEMailNotValideMsg("BAD").
- Validate both message fields before launching the transformation.
Example fix
// before meta.setEMailValideMsg( "OK" ); meta.setEMailNotValideMsg( "" ); // after meta.setEMailValideMsg( "OK" ); meta.setEMailNotValideMsg( "BAD" );
Defensive patterns
Strategy: validation
Validate before calling
if ( meta.isResultAsString()
&& ( meta.getEMailNotValideMsg() == null || meta.getEMailNotValideMsg().isEmpty() ) ) {
meta.setEMailNotValideMsg( "BAD" );
} Try / catch
try {
trans.execute( null );
} catch ( KettleException e ) {
if ( e.getMessage().contains( "EMailNotValidMsgMissing" ) ) {
logError( "Set 'not valid email message' or disable result-as-string" );
}
throw e;
} Prevention
- Always pair EMailValideMsg with EMailNotValideMsg in string mode.
- Validate step metadata programmatically before execution.
- Keep default failure messages in your step factory code.
- Check settings after migrating from boolean output mode.
When it happens
Trigger: Running the Mail Validator step with 'result as string' enabled while the 'not valid email message' field in the dialog is blank (the valid-message check passes but this one fails).
Common situations: Configuring only the valid message and forgetting the failure message; step settings partially migrated from boolean-output configuration.
Understand the failure class
Background: "must not be empty", "cannot be empty" — required-field validation errors across open-source libraries — this error's family across 41 libraries.
Related errors
- MailValidator.Error.EMailValidMsgMissing
- MailValidator.Error.FilenameFieldMissing
- MailValidator.Error.ResultFieldNameMissing
- MailValidator.Exception.CouldnotFindField
- At this time we don't support the use of multiple cluster…
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/9762290347d45a37.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/mail-validator/impl/src/main/java/org/pentaho/di/trans/steps/mailvalidator/MailValidator.java:82
data.previousRowMeta = getInputRowMeta().clone();
data.NrPrevFields = data.previousRowMeta.size();
data.outputRowMeta = getInputRowMeta().clone();
meta.getFields( getTransMeta().getBowl(), data.outputRowMeta, getStepname(), null, null, this, repository,
metaStore );
// check result fieldname
data.realResultFieldName = environmentSubstitute( meta.getResultFieldName() );
if ( Utils.isEmpty( data.realResultFieldName ) ) {
throw new KettleException( BaseMessages.getString( PKG, "MailValidator.Error.ResultFieldNameMissing" ) );
}
if ( meta.isResultAsString() ) {
if ( Utils.isEmpty( meta.getEMailValideMsg() ) ) {
throw new KettleException( BaseMessages.getString( PKG, "MailValidator.Error.EMailValidMsgMissing" ) );
}
if ( Utils.isEmpty( meta.getEMailNotValideMsg() ) ) {
throw new KettleException( BaseMessages.getString( PKG, "MailValidator.Error.EMailNotValidMsgMissing" ) );
}
data.msgValidMail = environmentSubstitute( meta.getEMailValideMsg() );
data.msgNotValidMail = environmentSubstitute( meta.getEMailNotValideMsg() );
}
// Check is email address field is provided
if ( Utils.isEmpty( meta.getEmailField() ) ) {
throw new KettleException( BaseMessages.getString( PKG, "MailValidator.Error.FilenameFieldMissing" ) );
}
data.realResultErrorsFieldName = environmentSubstitute( meta.getErrorsField() );
// cache the position of the field
if ( data.indexOfeMailField < 0 ) {
data.indexOfeMailField = data.previousRowMeta.indexOfValue( meta.getEmailField() );
if ( data.indexOfeMailField < 0 ) {
// The field is unreachable !View on GitHub (pinned to f3058517a1)