Отправка 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