EmailService.java

package com.saltynote.service.service;

import com.saltynote.service.domain.EmailPayload;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import jakarta.validation.constraints.NotNull;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;

import java.io.IOException;
import java.util.Collections;

@Service
public class EmailService {

    private final JavaMailSender mailSender;

    @Value("${spring.mail.username}")
    private String emailSender;

    private final Configuration freemarkerConfig;

    public EmailService(JavaMailSender mailSender) {
        this.mailSender = mailSender;
        this.freemarkerConfig = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
        this.freemarkerConfig.setClassForTemplateLoading(this.getClass(), "/templates/");
    }

    public void send(String receiver, String subject, String message) {
        SimpleMailMessage mailMessage = new SimpleMailMessage();
        mailMessage.setTo(receiver);
        mailMessage.setSubject(subject);
        mailMessage.setText(message);
        mailMessage.setFrom(emailSender);
        mailSender.send(mailMessage);
    }

    public void sendAsHtml(String receiver, String subject, @NotNull EmailPayload emailPayload)
            throws MessagingException, IOException, TemplateException {
        MimeMessage message = mailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
        helper.setTo(receiver);
        helper.setSubject(subject);
        helper.setFrom(emailSender);
        // Use the true flag to indicate the text included is HTML
        Template t = freemarkerConfig.getTemplate("email/general.ftlh");
        String content = FreeMarkerTemplateUtils.processTemplateIntoString(t,
                Collections.singletonMap("payload", emailPayload));
        helper.setText(content, true);
        mailSender.send(message);
    }

}