undefined

Send Email

Java Collections
10 уровень , 5 лекция
Открыта

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

Сегодня я научу тебя, как отправить 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));

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

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

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

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

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

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

Комментарии (39)
Чтобы просмотреть все комментарии или оставить свой,
перейдите в полную версию
Aleksandr 41 уровень
1 апреля 2021
В maven по поиску:

javax.mail:javax.mail-api:
Дмитрий 41 уровень, Санкт-Петербург
18 марта 2021
В общем, простой и быстрый способ проверить библиотеку. Регаемся(берем существующую почту) на мейл.ру В пропертис вставляем: mail.transport.protocol=smtp mail.host=smtp.mail.ru mail.smtp.ssl.enable=true mail.smtp.auth=true mail.user=вашапочта@mail.ru mail.password=ваш пароль. Объект MimeMessage настраиваем по статье, но в конце ОБЯЗАТЕЛЬНО добавляем свой адрес (такой же, как в конфиге): message.addFrom(new Address[]{new InternetAddress("вашадрес@mail.ru)}); Далее авторизируемся на сервере и отправляем письмо
Алексей 41 уровень, Чебоксары
14 февраля 2021
2 часа убил, чтобы отправить письмо с gmail. Перепробовал все примеры из комментариев. В лекции конечно лажа. Заработал только пример по ссылке (VIA TLS), но нужно в properties добавить строчку

prop.put("mail.smtp.ssl.trust", "smtp.gmail.com");
и в настройках почты разрешить доступ к аккаунту из ненадежных приложений.
Алексей Мирный 41 уровень, Москва
22 января 2021
На своей Motolola такую штуку делал году в 2007)
Evgeniia 41 уровень
1 декабря 2020
https://www.tutorialspoint.com/javamail_api/javamail_api_send_email_with_attachment.htm Вот ещё пошагово
Ihor 41 уровень, Киев
3 ноября 2020
message.setFrom - без него не пошло, и настройки гугла, если он начнет ругаться значит что-то пытается отправляться, но безопасность его банит
Хорс 41 уровень, Харьков
17 октября 2020
разрешил в гугле доступ сторонним приложениям и всё получилось с первого раза
MezoneOrange 37 уровень, Екатеринбург
8 октября 2020
примеры с gmail Используя пример 1. Gmail SMTP via TLS - получилось отправить
рустам 41 уровень
26 мая 2020
Уже голову сломал себе! Может кто то подскажет что делать? Скачал библиотеку javax.mail-api-1.4.7, подключил ее в External Libraries, строки перестали гореть красным, ок. Запускаю и...вылазит вот такая ошибка: Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/MailLogger at javax.mail.Session.initLogger(Session.java:227) at javax.mail.Session.<init>(Session.java:212) at javax.mail.Session.getDefaultInstance(Session.java:315) at javax.mail.Session.getDefaultInstance(Session.java:355) at com.javarush.task.task40.testMail.Test.main(Test.java:21) После 2х дней гугления, как я понял эта библиотека подключается на этапе компиляции, но не подключается во время исполнения и вроде как ее надо как то дополнительно подключать, но как, нигде не нашел..но это не точно(( Подскажите, что делать?
Денис 41 уровень, Москва
12 мая 2020
у меня получилось отправить(IDEA бесплатная).