MailConsumer.java

package io.github.giulong.spectrum.utils.events;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonPropertyDescription;
import io.github.giulong.spectrum.pojos.events.Attachment;
import io.github.giulong.spectrum.pojos.events.Event;
import io.github.giulong.spectrum.utils.FreeMarkerWrapper;
import jakarta.activation.FileDataSource;
import lombok.Getter;
import org.simplejavamail.api.email.AttachmentResource;
import org.simplejavamail.api.mailer.Mailer;
import org.simplejavamail.email.EmailBuilder;
import org.simplejavamail.mailer.MailerBuilder;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Getter
public class MailConsumer extends EventsConsumer {

    @JsonIgnore
    private final FreeMarkerWrapper freeMarkerWrapper = FreeMarkerWrapper.getInstance();

    @JsonIgnore
    private final Mailer mailer = MailerBuilder.buildMailer();

    @JsonPropertyDescription("Template to be used when creating the message")
    private final String template = "mail.html";

    @JsonPropertyDescription("List of attachments to add to the email")
    private final List<Attachment> attachments = new ArrayList<>();

    @Override
    public void accept(final Event event) {
        final Map<String, Object> vars = Map.of("event", event);
        final String interpolatedTemplate = freeMarkerWrapper.interpolateTemplate(template, vars);

        mailer.sendMail(EmailBuilder
                .startingBlank()
                .withHTMLText(interpolatedTemplate)
                .withAttachments(attachments
                        .stream()
                        .map(a -> new AttachmentResource(a.getName(), new FileDataSource(a.getFile())))
                        .toList())
                .buildEmail());
    }
}