Envío de email en Kotlin: resumen de herramientas y ejemplos de código
El envío de correos electrónicos es una de las tareas típicas en el desarrollo web, notificaciones y servicios en segundo plano. En el ecosistema de Kotlin, que funciona en JVM, se pueden utilizar tanto bibliotecas Java clásicas como soluciones modernas orientadas a Kotlin. En este artículo analizaremos tres enfoques principales: javax.mail (Jakarta Mail), Ktor Client y Apache Commons Email. Aprenderá a configurar un cliente SMTP, enviar un correo simple y añadir adjuntos.
1. javax.mail (Jakarta Mail) — el estándar clásico
La biblioteca más común para trabajar con email en Java y Kotlin. Soporta completamente los protocolos SMTP, IMAP y POP3. Para un proyecto Kotlin, basta con añadir la dependencia en build.gradle.kts:
dependencies { implementation("com.sun.mail:javax.mail:1.6.2")}Ejemplo de envío de un correo de texto simple:
import javax.mail.*import javax.mail.internet.InternetAddressimport javax.mail.internet.MimeMessageimport java.util.Properties
fun sendSimpleEmail() { val props = Properties().apply { put("mail.smtp.auth", "true") put("mail.smtp.starttls.enable", "true") put("mail.smtp.host", "smtp.gmail.com") put("mail.smtp.port", "587") }
val session = Session.getInstance(props, object : Authenticator() { override fun getPasswordAuthentication(): PasswordAuthentication { return PasswordAuthentication("your-email@gmail.com", "your-password") } })
val message = MimeMessage(session).apply { setFrom(InternetAddress("from-email@gmail.com")) setRecipients(Message.RecipientType.TO, InternetAddress.parse("to-email@example.com")) subject = "¡Hola desde Kotlin!" setText("Este es un correo de prueba enviado con javax.mail.") }
Transport.send(message) println("¡Correo enviado con éxito!")}Importante: para Gmail se necesitará una contraseña de aplicación o OAuth2. No almacene credenciales en el código — use variables de entorno.
Envío de correo con adjunto
import javax.activation.DataHandlerimport javax.activation.FileDataSourceimport javax.mail.internet.MimeBodyPartimport javax.mail.internet.MimeMultipart
fun sendEmailWithAttachment() { // ... configuración de session como arriba ... val message = MimeMessage(session).apply { setFrom(InternetAddress("from@gmail.com")) setRecipients(Message.RecipientType.TO, InternetAddress.parse("to@example.com")) subject = "Correo con adjunto" }
val multipart = MimeMultipart()
// Parte de texto val textPart = MimeBodyPart().apply { setText("Mire el adjunto.") } multipart.addBodyPart(textPart)
// Adjunto val attachmentPart = MimeBodyPart().apply { dataHandler = DataHandler(FileDataSource("/path/to/file.pdf")) fileName = "documento.pdf" } multipart.addBodyPart(attachmentPart)
message.setContent(multipart) Transport.send(message)}2. Ktor Client — enfoque asíncrono moderno
Si su proyecto ya utiliza Ktor para solicitudes HTTP, puede enviar correos electrónicos a través de SMTP usando el plugin ktor-client-smtp. Esto ofrece las ventajas de las corrutinas y la ejecución asíncrona. Dependencia:
dependencies { implementation("io.ktor:ktor-client-core:2.3.0") implementation("io.ktor:ktor-client-smtp:2.3.0")}Ejemplo de envío:
import io.ktor.client.*import io.ktor.client.smtp.*import io.ktor.client.request.*import io.ktor.client.statement.*
suspend fun sendViaKtor() { val client = HttpClient {