Отправка email на Kotlin: библиотеки, примеры и настройка SMTP

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

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

Начать курс

Отправка 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. Подходит для быстрого прототипирования. Зависимость:

                
    
    

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