pentaho/pentaho-kettle · error · MessagingException

Mail.Error.ReplyEmailNotFilled

Error message

Mail.Error.ReplyEmailNotFilled

What it means

Thrown in Mail.sendMail() when the reply-to/from email address variable is empty, so a valid InternetAddress cannot be constructed and msg.setFrom() would fail. The library requires a non-empty reply address before building the MIME message.

Solutions

  1. Open the Mail step dialog and set the Destination (or relevant address) field to a valid email address.
  2. If the field references a variable like ${DEST_EMAIL}, define it in kettle.properties, run configuration parameters, or the transformation parameters with a non-empty value.
  3. Add a validation/check step (or 'Check logic' in the step) before send to fail fast on empty addresses.

Example fix

// before
replyAddress = "${DEST_EMAIL}"; // DEST_EMAIL unset at runtime
// after
replyAddress = "ops@example.com"; // or ensure DEST_EMAIL is defined in kettle.properties
Defensive patterns

Strategy: validation

Validate before calling

String addr = transMeta.environmentSubstitute(replyAddress);
if (addr == null || addr.trim().isEmpty()) {
  throw new KettleException("Mail step: reply/destination address is empty; set it or define the referenced variable.");
}

Try / catch

try { sendMail(...); } catch (MessagingException e) { logError("Mail send failed: check address configuration: " + e.getMessage(), e); }

Prevention

When it happens

Trigger: sendMail() is called with replyAddress (destination/from field) null, empty, or containing only whitespace after environment variable substitution.

Common situations: Mail step configured without a destination address; a kettle environment variable (e.g. ${DEST_EMAIL}) is unset or empty at runtime; address only in a variable that was not defined in the transformation's parameter/environment settings.

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

Appendix: source

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

      msg.setHeader( "X-Priority", priorityAsInt ); // (String)int between 1= high and 3 = low.
      msg.setHeader( "Importance", meta.getImportance() );
      // seems to be needed for MS Outlook.
      // where it returns a string of high /normal /low.
      msg.setHeader( "Sensitivity", meta.getSensitivity() );
      // Possible values are normal, personal, private, company-confidential
    }

    // set Email sender
    String emailAddress = senderAddress;
    if ( !Utils.isEmpty( emailAddress ) ) {
      // get sender name
      if ( !Utils.isEmpty( senderName ) ) {
        emailAddress = senderName + '<' + emailAddress + '>';
      }
      msg.setFrom( new InternetAddress( emailAddress ) );
    } else {
      throw new MessagingException( BaseMessages.getString( PKG, "Mail.Error.ReplyEmailNotFilled" ) );
    }

    // Set reply to
    if ( !Utils.isEmpty( replyToAddresses ) ) {
      // get replay to
      // Split the mail-address: space separated
      String[] reply_Address_List = replyToAddresses.split( " " );
      InternetAddress[] address = new InternetAddress[reply_Address_List.length];

      for ( int i = 0; i < reply_Address_List.length; i++ ) {
        address[i] = new InternetAddress( reply_Address_List[i] );
      }

      // To add the real reply-to
      msg.setReplyTo( address );
    }

    // Split the mail-address: space separated

View on GitHub (pinned to f3058517a1)