Отправка email на Kotlin: обзор библиотек и практические примеры
Kotlin — современный язык программирования, который активно используется для создания серверных приложений, бэкенда и микросервисов. Возможность программно отправлять электронные письма — одна из ключевых функций для многих проектов: уведомления, подтверждения регистрации, рассылки. В этой статье мы разберём, как организовать отправку email на Kotlin, какие библиотеки использовать и как настроить SMTP-соединение.
Основные способы отправки email в Kotlin
Поскольку Kotlin работает на JVM, вы можете использовать любые Java-библиотеки. Самый популярный и проверенный способ — JavaMail (Jakarta Mail). Альтернативный вариант — Ktor Client (часть фреймворка Ktor), который умеет работать с SMTP напрямую. Рассмотрим оба подхода.
1. Отправка email с помощью Jakarta Mail (JavaMail)
Jakarta Mail (ранее JavaMail) — стандартная библиотека для работы с email в экосистеме Java. Для Kotlin она подходит идеально, так как полностью совместима с JVM. Вам потребуется добавить зависимость в build.gradle.kts:
dependencies {
implementation("com.sun.mail:jakarta.mail:2.0.1")
}
После добавления библиотеки можно написать простую функцию отправки:
import jakarta.mail.*
import jakarta.mail.internet.InternetAddress
import jakarta.mail.internet.MimeMessage
import 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("Email успешно отправлен на $to")
} catch (e: MessagingException) {
println("Ошибка отправки: ${e.message}")
}
}
Вызов функции:
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 = "Привет из Kotlin!",
body = "Это тестовое письмо, отправленное через Kotlin и Jakarta Mail."
)
}
2. Отправка email с вложениями (Jakarta Mail)
Чтобы отправить письмо с файлом, нужно использовать MimeBodyPart и MimeMultipart:
import jakarta.mail.internet.MimeBodyPart
import jakarta.mail.internet.MimeMultipart
import 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)
}
// Текстовая часть
val textPart = MimeBodyPart().apply {
setText(body)
}
// Вложение
val attachmentPart = MimeBodyPart().apply {
attachFile(File(attachmentPath))
}
// Собираем multipart
val multipart = MimeMultipart().apply {
addBodyPart(textPart)
addBodyPart(attachmentPart)
}
message.setContent(multipart)
Transport.send(message)
}
3. Отправка email через Ktor Client
Ktor — асинхронный фреймворк для Kotlin. Для отправки email можно использовать клиентскую часть Ktor с поддержкой SMTP. Это хороший выбор, если вы уже используете Ktor в проекте. Добавьте зависимость в build.gradle.kts:
dependencies {
implementation("io.ktor:ktor-client-core:2.3.0")
implementation("io.ktor:ktor-client-cio:2.3.0")
implementation("io.ktor:ktor-client-smtp:2.3.0")
}
Пример отправки письма с использованием Ktor:
import io.ktor.client.*
import io.ktor.client.engine.cio.*
import io.ktor.client.plugins.smtp.*
import io.ktor.client.request.*
import io.ktor.client.statement.*
suspend fun sendEmailViaKtor() {
val client = HttpClient(CIO) {
install(SmtpPlugin) {
host = "smtp.gmail.com"