From bc8ec8de4f58daa9df40e833ba03ecdc23505d86 Mon Sep 17 00:00:00 2001 From: Gabriel Sancho Date: Thu, 26 Mar 2026 18:52:19 -0300 Subject: [PATCH] =?UTF-8?q?feat(backend):=20implement=20step=207=20?= =?UTF-8?q?=E2=80=94=20EmailSenderService=20(multipart=20SMTP)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../newsletter/service/EmailSenderService.kt | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 backend/src/main/kotlin/com/condado/newsletter/service/EmailSenderService.kt diff --git a/backend/src/main/kotlin/com/condado/newsletter/service/EmailSenderService.kt b/backend/src/main/kotlin/com/condado/newsletter/service/EmailSenderService.kt new file mode 100644 index 0000000..e175541 --- /dev/null +++ b/backend/src/main/kotlin/com/condado/newsletter/service/EmailSenderService.kt @@ -0,0 +1,41 @@ +package com.condado.newsletter.service + +import jakarta.mail.internet.InternetAddress +import jakarta.mail.internet.MimeMessage +import org.slf4j.LoggerFactory +import org.springframework.mail.javamail.JavaMailSender +import org.springframework.mail.javamail.MimeMessageHelper +import org.springframework.stereotype.Service + +/** + * Sends AI-generated emails via SMTP using Spring's [JavaMailSender]. + * Each email is sent as multipart (text/plain + text/html). + */ +@Service +class EmailSenderService(private val mailSender: JavaMailSender) { + + private val log = LoggerFactory.getLogger(javaClass) + + /** + * Sends an email from a virtual entity to all configured recipients. + * + * @param from Sender email address (the virtual entity's email). + * @param to List of recipient email addresses. + * @param subject Email subject line. + * @param body Email body (may be plain text or simple HTML). + */ + fun send(from: String, to: List, subject: String, body: String) { + log.info("Sending email from='$from' to=$to subject='$subject'") + val message: MimeMessage = mailSender.createMimeMessage() + val helper = MimeMessageHelper(message, true, "UTF-8") + helper.setFrom(InternetAddress(from)) + helper.setTo(to.toTypedArray()) + helper.setSubject(subject) + // Send as both plain text and HTML for maximum compatibility + val plainText = body.replace(Regex("<[^>]+>"), "").trim() + val htmlBody = if (body.contains(Regex("<[a-zA-Z]"))) body else "
$body
" + helper.setText(plainText, htmlBody) + mailSender.send(message) + log.info("Email sent successfully from='$from' subject='$subject'") + } +}