Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> java

Отправка email в Java: пошаговое руководство

Введение

Для отправки электронных писем из Java-приложения вам понадобятся JavaMail API и Java Activation Framework (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

Параметры:

Отправка 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");
    }
});

Лучшие практики

java

  1. Освоение операторов Java: типы, синтаксис и практические примеры
  2. Комментарии в Java: типы, использование и лучшие практики
  3. Освоение улучшенного цикла for в Java: синтаксис, примеры и лучшие практики
  4. Освоение строк в Java: создание, методы и лучшие практики
  5. Интерфейсы в Java: концепции, реализация и лучшие практики
  6. Анонимные внутренние классы в Java: определение, синтаксис и практические примеры
  7. Try-with-resources в Java: автоматическое управление ресурсами
  8. Аннотации в Java: типы, размещение и практические примеры
  9. Assertions в Java: практическое руководство по обнаружению багов и обеспечению надежности кода
  10. Понимание Java Vector: использование, особенности и сравнение с ArrayList