javaspringjakarta-mailvelocityapache-velocity

Velocity Template not able to parse and display data in html format


I have a simple email program written in Java and Spring with Velocity template to format data that sends email which should be displayed in html format. However, it just displays the data along with the html tags embedded in it without actually parsing them.

Am I missing anything here?

EmailService.java

public class EmailService {
    private static final Log LOG = LogFactory.getLog(EmailService.class);
    private static final String EMAIL_SUBJECT = ":: Risk Assessment Job Summary Results::";
    private final MailSender mailSender;
    private final String emailRecipientAddress;
    private final String emailSenderAddress;
    private static final String ERROR_MSG = "Error while sending notification email";
    private final TemplateFactory velocityTemplateFactory;
    private Template riskAssessmentJobResultSummaryTemplate;

    public EmailService(MailSender mailSender, String emailRecipientAddress,
            String emailSenderAddress, TemplateFactory velocityTemplateFactory) {
        this.mailSender = mailSender;
        this.emailRecipientAddress = emailRecipientAddress;
        this.emailSenderAddress = emailSenderAddress;
        this.velocityTemplateFactory = velocityTemplateFactory;
    }

    public void notify(String messageBody) {
        JavaMailSender javaMailSender = (JavaMailSender)mailSender;
        MimeMessage message = javaMailSender.createMimeMessage();
        MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(message);
        try {
            mimeMessageHelper.setSubject(getHostname() + " - " + EMAIL_SUBJECT);
            mimeMessageHelper.setTo(emailRecipientAddress);
            mimeMessageHelper.setFrom(emailSenderAddress);
            mimeMessageHelper.setText(getEmailContent(messageBody));
            javaMailSender.send(message);
        } catch (MailException e) {
            throw new EmailSendException(ERROR_MSG, e);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }

    private static String getHostname() {
        try {
            return InetAddress.getLocalHost().getHostName();
        } catch (UnknownHostException e) {
            return "unknown host";
        }
    }

    private String getEmailContent(String messageBody) {
        try {
            StringWriter stringWriter = new StringWriter();
            this.riskAssessmentJobResultSummaryTemplate =
                    velocityTemplateFactory.create("velocity/risk-assessment-job-results-summary.vm");
            VelocityContext velocityContext = new VelocityContext();
            velocityContext.put("hostname", getHostname());
            velocityContext.put("messageBody", messageBody);
            this.riskAssessmentJobResultSummaryTemplate.merge(velocityContext, stringWriter);
            return stringWriter.toString();
        } catch (IOException ex) {
            LOG.error("Unable to read the email template", ex);
            return null;
        }
    }
}

risk-assessment-job-results-summary.vm

<h3>Summary report for Risk Assessment Job on ${hostname}:</h3>
<table style="border:none;">
    <tr><td>${messageBody}</td></tr>
</table>

Actual Email Output:

<h3>Summary report for Risk Assessment Job on KOP-DBT0J12:</h3> 
<table style="border:none;">
<tr><td>
TotalTxPending: 0
TotalTxAccepted: 0
TotalTxRejected: 0
TotalTxProcessed: 0
</td></tr>
</table>

Expected Email Output:

Summary report for Risk Assessment Job on KOP-DBT0J12:
TotalTxPending: 0
TotalTxAccepted: 0
TotalTxRejected: 0
TotalTxProcessed: 0

Solution

  • Set the content as html

     message.setContent(getEmailContent(messageBody), "text/html; charset=utf-8")