Envío de correo electrónico en Kotlin: descripción general de bibliotecas y ejemplos prácticos
Kotlin es un lenguaje de programación moderno que se utiliza activamente para crear aplicaciones de servidor, backend y microservicios. La capacidad de enviar correos electrónicos programáticamente es una de las funciones clave para muchos proyectos: notificaciones, confirmaciones de registro, boletines. En este artículo, analizaremos cómo organizar el envío de correos electrónicos en Kotlin, qué bibliotecas usar y cómo configurar una conexión SMTP.
Formas principales de enviar correo electrónico en Kotlin
Dado que Kotlin se ejecuta en la JVM, puede usar cualquier biblioteca de Java. La forma más popular y probada es JavaMail (Jakarta Mail). Una alternativa es Ktor Client (parte del framework Ktor), que puede trabajar con SMTP directamente. Analicemos ambos enfoques.
1. Envío de correo electrónico con Jakarta Mail (JavaMail)
Jakarta Mail (anteriormente JavaMail) es una biblioteca estándar para trabajar con correo electrónico en el ecosistema Java. Es perfecta para Kotlin, ya que es totalmente compatible con la JVM. Deberá agregar la dependencia en build.gradle.kts:
dependencies { implementation("com.sun.mail:jakarta.mail:2.0.1")}Después de agregar la biblioteca, puede escribir una función de envío simple:
import jakarta.mail.*import jakarta.mail.internet.InternetAddressimport jakarta.mail.internet.MimeMessageimport java.util.*
fun sendEmail( host: String, port: Int, username: String, password: String, from: String, to: String, subject: String, body: String) { val props = Properties().apply { put("mail.smtp.host", host) put("mail.smtp.port", port.toString()) put("mail.smtp.auth", "true") put("mail.smtp.starttls.enable", "true") }
val session = Session.getInstance(props, object : Authenticator() { override fun getPasswordAuthentication(): PasswordAuthentication { return PasswordAuthentication(username, password) } })
try { val message = MimeMessage(session).apply { setFrom(InternetAddress(from)) setRecipients(Message.RecipientType.TO, InternetAddress.parse(to)) setSubject(subject) setText(body) } Transport.send(message) println("Correo electrónico enviado exitosamente a $to") } catch (e: MessagingException) { println("Error al enviar: ${e.message}") }}Llamada a la función:
fun main() { sendEmail( host = "smtp.gmail.com", port = 587, username = "youremail@gmail.com", password = "your-app-password", from = "youremail@gmail.com", to = "recipient@example.com", subject = "¡Hola desde Kotlin!", body = "Este es un correo de prueba enviado a través de Kotlin y Jakarta Mail." )}2. Envío de correo electrónico con archivos adjuntos (Jakarta Mail)
Para enviar un correo con un archivo, debe usar MimeBodyPart y MimeMultipart:
import jakarta.mail.internet.MimeBodyPartimport jakarta.mail.internet.MimeMultipartimport java.io.File
fun sendEmailWithAttachment( session: Session, from: String, to: String, subject: String, body: String, attachmentPath: String) { val message = MimeMessage(session).apply { setFrom(InternetAddress(from)) setRecipients(Message.RecipientType.TO, InternetAddress.parse(to)) setSubject(subject) }
// Parte de texto val textPart = MimeBodyPart().apply { setText(body) }
// Archivo adjunto val attachmentPart = MimeBodyPart().apply { attachFile(File(attachmentPath)) }
// Ensamblamos multipart val multipart = MimeMultipart().apply { addBodyPart(textPart)