{"record":{"id":"4be7a77e9cd6df4f","repo":"pentaho/pentaho-kettle","slug":"mail-log-dynamicfilenamefieldempty","errorCode":null,"errorMessage":"Mail.Log.DynamicFilenameFieldEmpty","messagePattern":"Mail\\.Log\\.DynamicFilenameFieldEmpty","errorType":"validation","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"plugins/mail/impl/src/main/java/org/pentaho/di/trans/steps/mail/Mail.java","lineNumber":478,"sourceCode":"  void validateMetaFields( MailMeta meta ) throws KettleException {\n    // Check is filename field is provided\n    if ( Utils.isEmpty( meta.getDestination() ) ) {\n      throw new KettleException( BaseMessages.getString( PKG, \"Mail.Log.DestinationFieldEmpty\" ) );\n    }\n\n    // Check is replyname field is provided\n    if ( Utils.isEmpty( meta.getReplyAddress() ) ) {\n      throw new KettleException( BaseMessages.getString( PKG, \"Mail.Log.ReplyFieldEmpty\" ) );\n    }\n\n    // Check is SMTP server is provided\n    if ( Utils.isEmpty( meta.getServer() ) ) {\n      throw new KettleException( BaseMessages.getString( PKG, \"Mail.Log.ServerFieldEmpty\" ) );\n    }\n\n    // Check Attached filenames when dynamic\n    if ( meta.isDynamicFilename() && Utils.isEmpty( meta.getDynamicFieldname() ) ) {\n      throw new KettleException( BaseMessages.getString( PKG, \"Mail.Log.DynamicFilenameFieldEmpty\" ) );\n    }\n\n    // Check Attached zipfilename when dynamic\n    if ( meta.isZipFilenameDynamic() && Utils.isEmpty( meta.getDynamicZipFilenameField() ) ) {\n      throw new KettleException( BaseMessages.getString( PKG, \"Mail.Log.DynamicZipFilenameFieldEmpty\" ) );\n    }\n\n    validateZipFiles( meta );\n\n    // check authentication\n    if ( meta.isUsingAuthentication().equals( AUTENTICATION_BASIC ) ) {\n      // check authentication user\n      if ( Utils.isEmpty( meta.getAuthenticationUser() ) ) {\n        throw new KettleException( BaseMessages.getString( PKG, \"Mail.Log.AuthenticationUserFieldEmpty\" ) );\n      }\n\n      // check authentication pass\n      if ( Utils.isEmpty( meta.getAuthenticationPassword() ) ) {","sourceCodeStart":460,"sourceCodeEnd":496,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/mail/impl/src/main/java/org/pentaho/di/trans/steps/mail/Mail.java#L460-L496","documentation":"Thrown by Mail.validateMetaFields when the step is configured for dynamic attachment filenames (meta.isDynamicFilename() is true) but meta.getDynamicFieldname() — the incoming row field that supplies the attachment filename — is empty. The step cannot know which row field to read attachment paths from, so it aborts. This pairs with error 3199, which fires when the named field is set but absent from the row.","triggerScenarios":"Checking 'dynamic filename' for attachments in the Mail step but leaving the source-filename-field dropdown empty; MailMeta built in code with setDynamicFilename(true) but no setDynamicFieldname(...).","commonSituations":"Switching a step from static to dynamic attachments and forgetting to pick the field; the field dropdown reset after XML edits; programmatic meta construction enabling dynamic mode without naming the field.","solutions":["In the Mail step dialog, select the incoming field that contains the attachment filename in the dynamic-filename field dropdown.","Call meta.setDynamicFieldname(\"attachmentPathField\") in code whenever setDynamicFilename(true) is used.","If dynamic attachments are not needed, disable the dynamic filename option instead of leaving the field blank."],"exampleFix":"// before\nmeta.setDynamicFilename(true);\n// after\nmeta.setDynamicFilename(true);\nmeta.setDynamicFieldname(\"attachmentPath\");","handlingStrategy":"validation","validationCode":"if ( meta.isDynamicFilename() && ( meta.getDynamicFieldname() == null || meta.getDynamicFieldname().trim().isEmpty() ) ) {\n  throw new IllegalArgumentException(\"Mail step: dynamic filename field must be selected\");\n}","typeGuard":null,"tryCatchPattern":"try { transformation.execute(); } catch ( KettleException e ) { if ( e.getMessage().contains(\"DynamicFilenameFieldEmpty\") ) { /* enable/set setDynamicFieldname or disable dynamic mode */ } else { throw e; } }","preventionTips":["Whenever enabling dynamic filenames, immediately select the source field","Pair config reviews: dynamic flags must always accompany their field references","Unit-test transformations with dynamic attachments before deployment"],"tags":["kettle","mail-step","validation","dynamic-fields"],"backgroundTag":"empty-required-field","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}