Отправка email на Java: библиотека Jakarta Mail (JavaMail)

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

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

Начать курс

Отправка email на Java: библиотека Jakarta Mail (JavaMail)

В Java отправка электронной почты традиционно реализуется через мощный и гибкий API — JavaMail. После перехода Java EE в Eclipse Foundation, библиотека получила новое имя — Jakarta Mail (для Jakarta EE 9+) и актуальный пакет jakarta.mail. В этом руководстве мы рассмотрим, как настроить и использовать Jakarta Mail (или классический JavaMail) для отправки писем через SMTP-сервер.

Что такое Jakarta Mail (JavaMail)?

Jakarta Mail — это платформонезависимый фреймворк для создания почтовых клиентов. Он предоставляет набор абстракций для работы с протоколами SMTP, POP3 и IMAP. Для отправки email нас интересует протокол SMTP. Библиотека поддерживает:

  • Отправку простых текстовых сообщений (text/plain).
  • Отправку HTML-писем с вложениями (multipart/mixed).
  • Работу с SSL/TLS шифрованием (SMTPS).
  • Аутентификацию на почтовом сервере.

Установка и подключение

Для работы с Jakarta Mail вам потребуется добавить зависимость в ваш проект. Если вы используете Maven, добавьте в pom.xml:

<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>jakarta.mail</artifactId>
    <version>2.0.1</version>
</dependency>

Для классического JavaMail (пакет javax.mail) используйте:

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>javax.mail-api</artifactId>
    <version>1.6.2</version>
</dependency>

Также потребуется реализация (обычно com.sun.mail:javax.mail:1.6.2).

Базовая отправка текстового письма

Рассмотрим минимальный пример отправки email через SMTP-сервер Gmail (или любой другой). Сначала создайте объект Properties, содержащий настройки SMTP:

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

public class EmailSender {
    public static void main(String[] args) {
        // Настройки SMTP сервера (например, Gmail)
        Properties props = new Properties();
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.port", "587");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true"); // TLS

        // Аутентификация
        String username = "your-email@gmail.com";
        String password = "your-app-password"; // Используйте пароль приложения!

        // Создание сессии
        Session session = Session.getInstance(props, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username, password);
            }
        });

        try {
            // Формирование письма
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress(username));
            message.setRecipients(Message.RecipientType.TO,
                    InternetAddress.parse("recipient@example.com"));
            message.setSubject("Привет из Java!");
            message.setText("Это тестовое сообщение, отправленное с помощью Jakarta Mail.");

            // Отправка
            Transport.send(message);
            System.out.println("Письмо успешно отправлено!");
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}

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

Отправка HTML-письма с вложением

Часто требуется отправить письмо с форматированным HTML и файлом. Для этого используется MimeMultipart:

import jakarta.mail.internet.MimeBodyPart;
import jakarta.mail.internet.MimeMultipart;

// ... (предыдущий код создания Session)

try {
    // 1. Создаем HTML-часть
    MimeBodyPart htmlPart = new MimeBodyPart();
    String htmlContent = "<h1>Заголовок</h1><p>Текст с <b>жирным</b> шрифтом.</p>";
    htmlPart.setContent(htmlContent, "text/html; charset=utf-8");

    // 2. Создаем часть с вложением
    MimeBodyPart attachmentPart = new MimeBodyPart();
    attachmentPart.attachFile("/path/to/file.pdf"); // Укажите путь к файлу
    attachmentPart.setFileName("документ.pdf");

    // 3. Объединяем в Multipart                    

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