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
- Open the Mail step dialog and fill in the Reply address (and reply name) fields.
- Call meta.setReplyAddress("reply@yourdomain.com") when constructing MailMeta programmatically.
- 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
- Treat reply address as mandatory when configuring the Mail step
- Keep a checklist of required Mail step fields (destination, reply, server)
- Source reply addresses from kettle.properties variables and validate them at startup
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
- Mail.Log.DestinationFieldEmpty
- DynamicSQLRow.Exception.SQLFieldNameEmpty
- ERROR0014
- GetTableNames.Log.NoSchemaField
- GPLoad.Exception.MatchColumnsNeeded
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)