Отправка email на Kotlin: обзор инструментов и примеры кода
Отправка электронных писем — одна из типовых задач в веб-разработке, уведомлениях и фоновых сервисах. В экосистеме Kotlin, работающем на JVM, можно использовать как классические Java-библиотеки, так и современные Kotlin-ориентированные решения. В этой статье мы разберём три основных подхода: javax.mail (Jakarta Mail), Ktor Client и Apache Commons Email. Вы узнаете, как настроить SMTP-клиент, отправить простое письмо и добавить вложения.
1. javax.mail (Jakarta Mail) — классический стандарт
Самая распространённая библиотека для работы с email в Java и Kotlin. Она полностью поддерживает протоколы SMTP, IMAP и POP3. Для Kotlin-проекта достаточно добавить зависимость в build.gradle.kts:
dependencies {
implementation("com.sun.mail:javax.mail:1.6.2")
}
Пример отправки простого текстового письма:
import javax.mail.*
import javax.mail.internet.InternetAddress
import javax.mail.internet.MimeMessage
import 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 = "Привет из Kotlin!"
setText("Это тестовое письмо, отправленное с помощью javax.mail.")
}
Transport.send(message)
println("Письмо отправлено успешно!")
}
Важно: для Gmail потребуется пароль приложения или OAuth2. Не храните учётные данные в коде — используйте переменные окружения.
Отправка письма с вложением
import javax.activation.DataHandler
import javax.activation.FileDataSource
import javax.mail.internet.MimeBodyPart
import javax.mail.internet.MimeMultipart
fun sendEmailWithAttachment() {
// ... настройка session как выше ...
val message = MimeMessage(session).apply {
setFrom(InternetAddress("from@gmail.com"))
setRecipients(Message.RecipientType.TO, InternetAddress.parse("to@example.com"))
subject = "Письмо с вложением"
}
val multipart = MimeMultipart()
// Текстовая часть
val textPart = MimeBodyPart().apply {
setText("Смотрите вложение.")
}
multipart.addBodyPart(textPart)
// Вложение
val attachmentPart = MimeBodyPart().apply {
dataHandler = DataHandler(FileDataSource("/path/to/file.pdf"))
fileName = "документ.pdf"
}
multipart.addBodyPart(attachmentPart)
message.setContent(multipart)
Transport.send(message)
}
2. Ktor Client — современный асинхронный подход
Если ваш проект уже использует Ktor для HTTP-запросов, вы можете отправлять email через SMTP с помощью плагина ktor-client-smtp. Это даёт преимущества корутин и асинхронного выполнения. Зависимость:
dependencies {
implementation("io.ktor:ktor-client-core:2.3.0")
implementation("io.ktor:ktor-client-smtp:2.3.0")
}
Пример отправки:
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 {
install(Smtp) {
host = "smtp.gmail.com"
port = 587
startTls = true
credentials {
username = "your-email@gmail.com"
password = "your-password"
}
}
}
client.use {
it.smtpSend {
from = "from@gmail.com"
to = listOf("to@example.com")
subject = "Ktor email"
body = "Отправлено через Ktor Client!"
}
}
}
Плюсы: нативная интеграция с корутинами, лёгкий вес, единый стиль с другими Ktor-компонентами. Минусы: меньше гибкости для сложных MIME-структур.
3. Apache Commons Email — удобная обёртка
Библиотека Apache Commons Email построена поверх javax.mail и предлагает более простой Fluent API. Подходит для быстрого прототипирования. Зависимость:
Также в библиотеке
Рекомендаций