Send Email

Открыта

— А вот и снова я. И снова у меня для тебя небольшой сюрприз.

Сегодня я научу тебя, как отправить email с помощью Java.

Начнем с хорошей новости – в Java есть родная библиотека для работы с почтой.

А плохая новость состоит в том, что эта библиотека входит в состав Java EE, но не в Java SE.

Java EE – это расширенная версия JavaSE, куда входят классы, которые нужны для более навороченных приложений. Как работа с почтой, например.

— Ясно и что же делать?

— Ну, предлагаю, просто скачать данную библиотеку и все.

Воспользуемся мудростью Intellij IDEA.

Создай класс и добавь в раздел импорта пакеты javax.mail.* и javax.mail.internet.*

Затем жми Alt+Enter и пусть IDEA все сделает за тебя:

Так выглядит предложение скачать недостающие библиотеки

Send Email - 1

Так выглядит окно закачки.

Send Email - 2

Ну, или его можно скачать по этой ссылке.

— Скачал. Что дальше?

— Тебе надо зайти в настройки проекта (Open Module Settings) в раздел Libraries и добавить туда jar-файлы из скачанного архива.

Send Email - 3

— Готово.

— Строки перестали светиться красным?

import javax.mail.internet.MimeMessage;
import javax.mail.internet.*;

— Ага.

— Отлично, тогда продолжим.

Отправка письма состоит из трех частей.

1) Установить соединение с почтовым сервером, через который будет отправлено письмо

2) Создать письмо, добавить вложения если надо

3) Отправить письмо.

Начнём сначала.

Чтобы отравить email в Java, для начала нужно установить соединение с почтовым сервером.

Лучше всего, чтобы там у тебя уже был почтовый аккаунт. Современные почтовые серверы не хотят рассылать сообщения анонимных пользователей, опасаясь спама.

Создать соединение с сервером можно одним вызовом метода javax.mail.Session.getDefaultInstance:

Создаем соединение с почтовым сервером
Properties props = new Properties();

//тут надо загрузить данные в объект props

Session session = Session.getDefaultInstance(props);

Но этому методу нужно передать настройки почтового сервера.

Например, можно создать файл Mail.properties и заполнить его нужными настройками, например, как-то так:

Mail.properties
mail.transport.protocol=smtp
mail.host=smtp.gmail.com
mail.smtp.auth=true
mail.user=arnold@gmail.com
mail.password=strong

Главное – это задать protocol и host, но возможно понадобятся дополнительные настройки, в зависимости от режима работы почтового сервера.

А можно просто добавить эти данные в объект типа Properties прямо в Java-коде.

Пример:

Создаем соединение с почтовым сервером
Properties props = new Properties();
props.put("mail.transport.protocol", "smtps");
props.put("mail.smtps.host", “smtp.gmail.com”);
props.put("mail.smtps.auth", "true");
props.put("mail.smtp.sendpartial", "true");

Session session = Session.getDefaultInstance(props);

Отлично, сессия у нас есть, теперь давай создадим почтовое сообщение.

Сделать это легче, чем кажется на первый взгляд. Пример:

Создание почтового сообщения
//создаем сообщение
MimeMessage message = new MimeMessage(session);

//устанавливаем тему письма
message.setSubject("тестовое письмо!");

//добавляем текст письма
message.setText("Asta la vista, baby!");

//указываем получателя
message.addRecipient(Message.RecipientType.TO, new InternetAddress("stalone@gmail.com"));

//указываем дату отправления
message.setSentDate(new Date());

— В качестве получателя можно указать любой email?

— Ага. Более того. Можно указать и отправителя. Любой email-адрес.

— Круто! Я это учту.

— Теперь осталось отправить это сообщение.

Сначала мы авторизуемся на сервере, а затем отправим свое сообщение. Всего две строчки кода:

Отправка сообщения
//логин и пароль gmail пользователя
String userLogin = “arnold@gmail.com;
String userPassword = “strong”;

//авторизуемся на сервере:
Transport transport = session.getTransport();
transport.connect("smtp.gmail.com", 465, userLogin, userPassword);

//отправляем сообщение:
transport.sendMessage(message, message.getRecipients(Message.RecipientType.TO));

— Как интересно. Надо пробовать.

— Если тебе интересно, как отправить письмо с вложениями, то можешь почитать про это тут.

Если хочешь разобраться, как еще и получать почту, милости прошу сюда.

— Ух ты, какие полезные ссылки.

Да, я теперь свой почтовый клиент сделаю. Круто!

Спасибо, Элли!

Комментарии (79)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Anonymous #3186058
Уровень 50
5 сентября, 11:43
С библиотеками указанными в этой статье у меня ничего не заработало! Вот то, что прокатило: 1. Скачайте библиотеку com.sun.mail:javax.mail:1.6.2 Далее актуально для почты mail.ru 2. Всё как в лекции, НО добавьте эту строку в код: message.addFrom(new Address[]{new InternetAddress("ваша_почта@mail.ru")}); 3. Содержимое файла Mail.properties: mail.smtp.host=smtp.mail.ru mail.smtp.auth=true mail.smtp.port=465 mail.smtp.ssl.enable=true
Sergio Pi
Уровень 51
Expert
1 июля, 07:46
создавать новый проект через maven в pom.xml файл добавить зависимость
<dependencies>
       <!-- Зависимость для JavaMail API -->
       <dependency>
           <groupId>com.sun.mail</groupId>
           <artifactId>javax.mail</artifactId>
           <version>1.6.2</version>
       </dependency>
   </dependencies>
для gmail Генерация пароля
Sergio Pi
Уровень 51
Expert
1 июля, 07:46
public static void main(String[] args) {
        // Настройки для вашей почты
        final String username = "123456789@gmail.com";
        final String password = "qqqq wwww eeee xxxx";  // Генерация пароля из gmail "ссылка сверху"

        // Настройки для сервера SMTP
        Properties props = new Properties();
        props.put("mail.smtp.auth", "true"); // Enable authentication
        props.put("mail.smtp.starttls.enable", "true"); // Enable TLS
        props.put("mail.smtp.host", "smtp.gmail.com"); // SMTP сервер Gmail
        props.put("mail.smtp.port", "587"); // Порт для TLS

        // Создание сессии
        Session session = Session.getInstance(props,
                new javax.mail.Authenticator() {
                    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("123456@")); // адрес получателя
            message.setSubject("Тестовое письмо");
            message.setText("Привет,\n\nЭто тестовое письмо из Java.");

            // Отправка сообщения
            Transport.send(message);

            System.out.println("Письмо успешно отправлено.");

        } catch (MessagingException e) {
            throw new RuntimeException(e);
        }
    }
xyzie
Уровень 44
28 июня 2023, 09:32
Итак, если кто-то пробует отправить письмо через yandex, а у него по советам из инета нихрена не выходит, то вот способ. 1) Существует такая тема, как пароли приложений в яндексе. По описанию, если не ставишь пароль на почтовое приложение, то для сторонних почтовых приложений аутентификация должна происходить по обычному паролю, если ставишь, то только по паролю приложения. Но по тестам выходит, что без пароля приложения к порту попросту не коннектится. Поэтому шаг первый - поставить пароль для smtp. https://id.yandex.ru/security/app-passwords 2) Тут ниже советуют javax.mail:mail:1.4.7, с ней подключение по паролю приложения не работает. Попробовал com.sun.mail:javax.mail:1.6.2 - работает. 3)Connections properties. Пишут, что SSL работает на портах 465 и 587. У меня заработал только 465.
properties.put("mail.smtp.starttls.enable", "true");//Enable tls session
properties.put("mail.smtp.auth", "true");//Enable authentication
properties.put("mail.smtp.ssl.enable", "true");
properties.put("mail.smtp.host", "smtp.yandex.ru");//Server's host
properties.put("mail.smtp.port", "465");//Server's port
xyzie
Уровень 44
28 июня 2023, 09:32
4) создаем сессию, appPass - пароль приложения для smtp, настроенный ранее.
Session session = Session.getDefaultInstance(properties,
                new Authenticator() {
                    @Override
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(userLogin, appPass);
                    }
                });
5) Создаем message
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(userLogin)); // от кого
message.setSubject("test");
message.setText("test text");
message.setRecipient(Message.RecipientType.TO, new InternetAddress(userLogin));//кому
message.setSentDate(new Date());
6) Шлем
Transport.send(message);
Если кто-то расскажет, как отправить письмо на яндексе без настройки пароля приложения smtp, то буду благодарен.
Igor
Уровень 38
25 июня 2023, 10:38
Для тех кто пытается отправить письмо с gmail https://www.youtube.com/watch?v=lk5dhDzfzsU&t=334s
Всеволод Булатов Backend Developer в МЦ Сервис
7 июня 2023, 19:35
Через gmail отправить не получилось. Пока разбирался, нашёл в настройках аккаунта следующую информацию: "Чтобы защитить ваш аккаунт, начиная с 30 мая 2022 года Google больше не поддерживает сторонние приложения и устройства, которые предлагают войти в аккаунт Google только с помощью имени пользователя и пароля." Через mail.ru письмо отправилось. Из нюансов: 1. Надо использовать не обычный пароль от УЗ, а "Пароль для внешнего приложения", создаётся в настройках почты. 2. Должна быть отключена двухфакторная авторизация.
NacWay
Уровень 37
29 марта 2023, 10:58
NacWay
Уровень 37
29 марта 2023, 10:59
Только из Multipart уберите MimeBodyPart text. Оставьте только вложение.
TemaCode
Уровень 51
19 февраля 2023, 10:24
материал 💩💩 разговор идет IDEA все сделает за тебя - потом или скачайте сами) видно по скринам что и то и то установленно, ну как можно так небрежно учебный материал составлять))
Sergey Edilyan
Уровень 47
18 февраля 2023, 12:14
если у когото не получается попробуйта как показано тут https://netcorecloud.com/tutorials/send-email-in-java-using-gmail-smtp/ я попробывал много вариантов но только этот сработал
Sergey Edilyan
Уровень 47
18 февраля 2023, 12:42
увас кинет исключение если вы не войдете в ваш gmail потом manage your google account потом security и уже там нужно найти Signing in to Google и выбрать App passwords и создать пароль и уже в коде из примера new PasswordAuthentication("fromaddress@gmail.com", "App password") передать в указоном месте
Yury
Уровень 51
9 февраля 2023, 16:44
Долго не мог отправить с mail.ru на mail.ru. была ошибка: 535 5.7.0 NEOBHODIM parol prilozheniya. Оказывается нужна последняя версия библиотеки 1.6.2. вот ссылка javaMail-1.6.2.jar Всё отправилось, в исходящих сообщение отсутствует.