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

  1. Open the Mail Validator step dialog and set the 'not valid email message' (e.g. 'BAD').
  2. Disable 'result as string' if boolean output suffices.
  3. Set it in code: meta.setEMailNotValideMsg("BAD").
  4. 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

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


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)