Отправка email на Kotlin: библиотеки и примеры кода

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Отправка email на Kotlin: полное руководство по библиотекам и инструментам

Отправка email — одна из ключевых задач в современных веб-приложениях: от подтверждения регистрации до уведомлений и маркетинговых рассылок. Kotlin, как современный язык для JVM, предоставляет несколько подходов для работы с почтой. В этой статье мы разберём три основных варианта: классический JavaMail, асинхронный Ktor Client и облачный сервис SendGrid. Вы узнаете, как отправлять простые текстовые и HTML-письма, прикреплять файлы и обрабатывать ошибки.

1. JavaMail — проверенный стандарт

JavaMail — это стандартная библиотека для работы с email в экосистеме Java/Kotlin. Она поддерживает протоколы SMTP, POP3 и IMAP, а также SSL/TLS шифрование. Для Kotlin-проекта достаточно добавить зависимость в build.gradle.kts:

dependencies {
    implementation("com.sun.mail:jakarta.mail:2.0.1")
}

Пример отправки простого текстового письма через SMTP с аутентификацией:

import jakarta.mail.*
import jakarta.mail.internet.InternetAddress
import jakarta.mail.internet.MimeMessage
import java.util.Properties

fun sendEmailViaJavaMail() {
    val props = Properties().apply {
        put("mail.smtp.host", "smtp.gmail.com")
        put("mail.smtp.port", "587")
        put("mail.smtp.auth", "true")
        put("mail.smtp.starttls.enable", "true")
    }

    val session = Session.getInstance(props, object : Authenticator() {
        override fun getPasswordAuthentication(): PasswordAuthentication {
            return PasswordAuthentication("your-email@gmail.com", "your-app-password")
        }
    })

    try {
        val message = MimeMessage(session).apply {
            setFrom(InternetAddress("your-email@gmail.com"))
            setRecipient(Message.RecipientType.TO, InternetAddress("recipient@example.com"))
            subject = "Привет из Kotlin!"
            setText("Это тестовое письмо, отправленное с JavaMail.")
        }
        Transport.send(message)
        println("Письмо успешно отправлено!")
    } catch (e: MessagingException) {
        println("Ошибка отправки: ${e.message}")
    }
}

Важно: Для Gmail необходимо использовать пароль приложения (App Password), а не основной пароль. Также можно настроить SMTP для Yandex, Mail.ru или собственного сервера.

2. Ktor Client — асинхронный подход

Если вы используете фреймворк Ktor для создания веб-приложений, то можете отправлять email через HTTP-запросы к почтовым API (например, Mailgun, SendGrid, Postmark). Это удобно для асинхронных сервисов и микросервисной архитектуры.

Добавьте зависимость:

dependencies {
    implementation("io.ktor:ktor-client-core:2.3.7")
    implementation("io.ktor:ktor-client-cio:2.3.7")
    implementation("io.ktor:ktor-client-content-negotiation:2.3.7")
    implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.7")
}

Пример отправки письма через SendGrid API:

import io.ktor.client.*
import io.ktor.client.call.*
import io.ktor.client.plugins.contentnegotiation.*
import io.ktor.client.request.*
import io.ktor.http.*
import io.ktor.serialization.kotlinx.json.*
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json

@Serializable
data class EmailRequest(
    val personalizations: List<Personalization>,
    val from: EmailAddress,
    val subject: String,
    val content: List<Content>
)

@Serializable
data class Personalization(val to: List<EmailAddress>)

@Serializable
data class EmailAddress(val email: String)

@Serializable
data class Content(val type: String, val value: String)

suspend fun sendEmailViaSendGrid() {
    val client = HttpClient(CIO) {
        install(ContentNegotiation) {
            json(Json { ignoreUnknownKeys = true })
        }
    }

    val requestBody = EmailRequest(
        personalizations = listOf(Personalization(to = listOf(EmailAddress("recipient@example.com")))),
        from = EmailAddress("your-email@gmail.com"),
        subject = "Привет из Ktor!",
        content = listOf(Content("text/plain", "Это письмо отправлено через SendGrid API."))
    )

    try {
        val response = client.post("https://api.sendgrid.com/v3/mail/send") {
            header("Authorization", "Bearer YOUR_SENDGRID_API_KEY")
            contentType(ContentType.Application.Json)
            setBody(requestBody)
        }
        if (response.status == HttpStatusCode.Accepted) {
            println("Письмо отправлено!")
        } else {
            println("Ошибка: ${response.status}")
        }
    } catch (e: Exception) {
        println("Ошибка отправки: ${e.message}")
    } finally {
        client.close()
    }
}

Этот подход идеален для облачных систем, не требует настройки SMTP-сервера и легко масштабируется.

3. Отправка HTML

Рекомендаций