Отправка email в Java: пошаговое руководство
Введение
Для отправки электронных писем из Java-приложения вам понадобятся JavaMail API и Java Activation Framework (JAF). Эти библиотеки не входят в стандартный JDK, поэтому их необходимо скачать и подключить вручную.
Установка зависимостей
- Скачайте последнюю версию JavaMail (версия 1.6.2 или новее) с официального сайта Oracle или Maven Central.
- Скачайте JAF (версия 1.1.1 или новее) — начиная с Java 6 JAF включен в состав JDK, поэтому отдельная установка обычно не требуется.
После распаковки архивов добавьте файлы mail.jar и activation.jar в CLASSPATH вашего проекта. Если используете Maven или Gradle, просто добавьте соответствующие зависимости:
<!-- Maven -->
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
Отправка простого текстового письма
Пример ниже демонстрирует отправку базового email-сообщения через локальный SMTP-сервер (localhost). Убедитесь, что на вашей машине настроен и запущен почтовый сервер (например, Postfix, Sendmail или встроенный сервер для разработки).
Пример кода
import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.*;
public class SendEmail {
public static void main(String[] args) {
// Адреса получателя и отправителя
String to = "recipient@gmail.com";
String from = "sender@gmail.com";
// SMTP-сервер (здесь — локальный)
String host = "localhost";
// Настройка свойств сессии
Properties props = System.getProperties();
props.put("mail.smtp.host", host);
// Для внешних серверов часто нужны порт и аутентификация:
// props.put("mail.smtp.port", "587");
// props.put("mail.smtp.auth", "true");
// Создание сессии
Session session = Session.getDefaultInstance(props);
try {
// Создание сообщения
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
message.setSubject("Тестовое письмо из Java");
message.setText("Это простое текстовое сообщение.");
// Отправка
Transport.send(message);
System.out.println("Письмо успешно отправлено!");
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
Компиляция и запуск
$ javac SendEmail.java
$ java SendEmail
Письмо успешно отправлено!
Отправка письма нескольким получателям
Для добавления нескольких адресатов используйте метод addRecipients():
void addRecipients(Message.RecipientType type, Address[] addresses) throws MessagingException
Параметры:
- type — тип получателей:
Message.RecipientType.TO,CC(копия) илиBCC(скрытая копия). - addresses — массив объектов
InternetAddressс email-адресами.
Отправка HTML-письма
Для отправки форматированного HTML-контента используйте метод setContent() с MIME-типом "text/html":
message.setContent("<h1>Привет!</h1><p>Это <b>HTML</b>-письмо.</p>", "text/html");
Полный пример аналогичен предыдущему, отличается только способом установки содержимого.
Отправка письма с вложением
Вложения требуют создания MimeMultipart объекта, объединяющего текстовую часть и файл:
// Текстовая часть
BodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setText("Вот ваш файл.");
// Часть с вложением
messageBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource("document.pdf");
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName("document.pdf");
// Объединение частей
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(messageBodyPart); // текст
multipart.addBodyPart(messageBodyPart); // файл (используйте новый BodyPart для файла!)
message.setContent(multipart);
Важно: для каждого вложения создавайте отдельный экземпляр MimeBodyPart.
Аутентификация на SMTP-сервере
Если сервер требует логин/пароль, настройте свойства сессии:
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.user", "your_login");
props.put("mail.smtp.password", "your_password");
Для защищённых соединений (SSL/TLS) добавьте:
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.starttls.enable", "true"); // для TLS на порту 587
Тогда сессию лучше создавать с аутентификатором:
Session session = Session.getInstance(props, new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("login", "password");
}
});
Лучшие практики
- Всегда обрабатывайте исключения
MessagingException. - Для продакшена используйте пул соединений и асинхронную отправку.
- Не храните пароли в коде — используйте переменные окружения или конфигурационные файлы.
- Проверяйте корректность email-адресов перед отправкой.
- Для массовых рассылок рассмотрите специализированные сервисы (SendGrid, Amazon SES, Mailgun).
java
- Освоение операторов Java: типы, синтаксис и практические примеры
- Комментарии в Java: типы, использование и лучшие практики
- Освоение улучшенного цикла for в Java: синтаксис, примеры и лучшие практики
- Освоение строк в Java: создание, методы и лучшие практики
- Интерфейсы в Java: концепции, реализация и лучшие практики
- Анонимные внутренние классы в Java: определение, синтаксис и практические примеры
- Try-with-resources в Java: автоматическое управление ресурсами
- Аннотации в Java: типы, размещение и практические примеры
- Assertions в Java: практическое руководство по обнаружению багов и обеспечению надежности кода
- Понимание Java Vector: использование, особенности и сравнение с ArrayList