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
- Open the Mail step dialog and set the Destination (or relevant address) field to a valid email address.
- 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.
- 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
- Never leave the destination/reply field blank in the Mail step dialog.
- Prefer literal addresses over variables for fixed alerts; if using variables, define them in kettle.properties and document them.
- Run the step's 'Check logic' before deploying transformations.
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
- JobMail.Error.ReplyEmailNotFilled
- JobGetMailsFromPOP.Error.AttachmentFolderEmpty
- JobGetMailsFromPOP.Error.AttachmentFolderNotAFolder
- JobGetMailsFromPOP.Error.AttachmentFolderNotExist
- JobGetMailsFromPOP.Error.NotAFolderNot
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 separatedView on GitHub (pinned to f3058517a1)