pentaho/pentaho-kettle · error · KettleException

Mail.Log.ReplyFieldEmpty

Error message

Mail.Log.ReplyFieldEmpty

What it means

Thrown by Mail.validateMetaFields when meta.getReplyAddress() is empty. The Mail step requires a reply address (the address recipients reply to) before processing rows, so it fails fast with this KettleException during processRow. It is metadata validation, not an SMTP error.

Solutions

  1. Open the Mail step dialog and fill in the Reply address (and reply name) fields.
  2. Call meta.setReplyAddress("reply@yourdomain.com") when constructing MailMeta programmatically.
  3. Re-export/re-save the transformation to ensure the reply-address setting persists in the XML.

Example fix

// before
meta.setDestination("destField");
// after
meta.setDestination("destField");
meta.setReplyAddress("reply@yourdomain.com");
Defensive patterns

Strategy: validation

Validate before calling

if ( meta.getReplyAddress() == null || meta.getReplyAddress().trim().isEmpty() ) {
  throw new IllegalArgumentException("Mail step: reply address is required");
}

Try / catch

try { transformation.execute(); } catch ( KettleException e ) { if ( e.getMessage().contains("ReplyFieldEmpty") ) { /* set meta.setReplyAddress(...) and retry */ } else { throw e; } }

Prevention

When it happens

Trigger: Executing the Mail step with the 'Reply address' / reply-name field left blank in the step configuration; MailMeta built in code without setReplyAddress().

Common situations: Step dialog filled in except the reply section (users assume reply is optional); transformations copied from templates where the reply field was cleared; programmatic meta construction omitting setReplyAddress().

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/a80ff1520570f4b8. Report an issue: GitHub.

Appendix: source

Thrown at plugins/mail/impl/src/main/java/org/pentaho/di/trans/steps/mail/Mail.java:468

      if ( !meta.isZipFilenameDynamic() ) {
        data.ZipFilename = environmentSubstitute( meta.getZipFilename() );
      }
      // Attached files
      processAttachedFiles();
    }
  }

  @VisibleForTesting
  void validateMetaFields( MailMeta meta ) throws KettleException {
    // Check is filename field is provided
    if ( Utils.isEmpty( meta.getDestination() ) ) {
      throw new KettleException( BaseMessages.getString( PKG, "Mail.Log.DestinationFieldEmpty" ) );
    }

    // Check is replyname field is provided
    if ( Utils.isEmpty( meta.getReplyAddress() ) ) {
      throw new KettleException( BaseMessages.getString( PKG, "Mail.Log.ReplyFieldEmpty" ) );
    }

    // Check is SMTP server is provided
    if ( Utils.isEmpty( meta.getServer() ) ) {
      throw new KettleException( BaseMessages.getString( PKG, "Mail.Log.ServerFieldEmpty" ) );
    }

    // Check Attached filenames when dynamic
    if ( meta.isDynamicFilename() && Utils.isEmpty( meta.getDynamicFieldname() ) ) {
      throw new KettleException( BaseMessages.getString( PKG, "Mail.Log.DynamicFilenameFieldEmpty" ) );
    }

    // Check Attached zipfilename when dynamic
    if ( meta.isZipFilenameDynamic() && Utils.isEmpty( meta.getDynamicZipFilenameField() ) ) {
      throw new KettleException( BaseMessages.getString( PKG, "Mail.Log.DynamicZipFilenameFieldEmpty" ) );
    }

    validateZipFiles( meta );

View on GitHub (pinned to f3058517a1)