Введение

В этом руководстве рассматривается реализация отправки электронных писем с ESP32 через Arduino IDE. Мы охватим весь процесс: от установки библиотек и настройки SMTP-сервера до отправки писем в форматах обычного текста, HTML. Этот навык незаменим при создании систем оповещения в проектах Интернета вещей.
Необходимые детали
| № | Компонент | Количество | Купить |
|---|---|---|---|
| 1 | Отладочная плата ESP32 | 1 шт | Авито | AliExpress | RobotChip |
Описание
В качестве среды разработки для прошивки ESP32 будем использовать Arduino IDE, её необходимо скачать и установить. Также необходимо установить поддержку плат ESP32, как рассказывалось в прошлой статье.
Немного расскажу о протоколе SMTP (Simple Mail Transfer Protocol) — это стандарт связи, предназначенный для передачи электронной почты. Каждый почтовый провайдер (например, Яндекс, Mail.ru, Gmail и другие) использует собственные SMTP-серверы с уникальными адресами и портами, которые можно найти в настройках аккаунта. Когда вы нажимаете кнопку «Отправить», ваш почтовый клиент (MUA) по протоколу SMTP передаёт сообщение на исходящий сервер. Сервер определяет домен получателя через DNS-запись MX и перенаправляет письмо на соответствующий целевой сервер. Финальную доставку в почтовый ящик пользователя обеспечивает сервер входящей почты сервиса получателя по протоколам IMAP или POP3
Установка библиотеки
Для работы, будем использовать библиотеку «ReadyMail» скачать можно используя интегрированную среду разработки Arduino IDE», для этого откройте «Скетч → Подключение библиотеки → Менеджер библиотек…», так же выложу библиотеки в конце статьи или скачайте с GitHub.

Настройка аккаунта Яндекс
Для отправки писем с ESP32 потребуется электронная почта на «Яндексе» (или другом почтовом сервисе). Не буду описывать сам процесс создания учётной записи — расскажу только о том, как сгенерировать уникальный пароль для приложения.
Перейдите на страницу https://id.yandex.ru/ и выберите «Безопасность»

Нажмите «Пароли приложений»

Далее нажмите «Почта».

Придумайте любое название для приложения и нажмите «Далее».

Теперь скопируйте пароль, он отображается только один раз. Пароль понадобится позже, его нужно будет вставить в скетч.

Программа — Отправка электронного письма с помощью ESP32
Программа отправит электронное письмо с ESP32 через SMTP-сервер. Скопируйте приведенный ниже код в файл скетча. Вам потребуется указать данные Wi-Fi-сети, параметры SMTP-сервера, а также адреса электронной почты отправителя и получателя. Можно воспользоваться одной и той же почтой, но в будущем нужно изменить. В качестве примера используется SMTP-сервер «Яндекса».
Этот скетч для ESP32 будет отправлять письмо через SMTP-сервер при каждом включении платы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
#include <WiFi.h> // Библиотека для работы с Wi-Fi на ESP32 #include <WiFiClientSecure.h> // Клиент для защищенных SSL/TLS соединений #define ENABLE_SMTP // Включает функционал SMTP в библиотеке ReadyMail #define ENABLE_DEBUG // Включает отладочный вывод в Serial #include <ReadyMail.h> // Библиотека ReadyMail WiFiClientSecure ssl_client; // Защищенный клиент для подключения к SMTP по SSL SMTPClient smtp(ssl_client); // Объект SMTP-клиента, использующий ssl_client void setup() { Serial.begin(115200); // Запуск монитора последовательного порта для отладки WiFi.begin("YOUR_SSID", "YOUR_PASSWORD"); // Подключение к вашей Wi-Fi сети (замените на свои данные) while (WiFi.status() != WL_CONNECTED) delay(500); // Ожидание подключения к Wi-Fi ssl_client.setInsecure(); // Отключает проверку SSL-сертификата auto statusCallback = [](SMTPStatus status) { Serial.println(status.text); // Выводит статус подключения к SMTP в Serial Monitor }; smtp.connect("smtp.yandex.ru", 465, statusCallback); // Подключение к SMTP-серверу (замените адрес) if (smtp.isConnected()) { // Проверка, успешно ли установлено соединение smtp.authenticate("user@example.com", "password", readymail_auth_password); // Авторизация (замените email и пароль) SMTPMessage msg; // Создание объекта сообщения msg.headers.add(rfc822_from, "ReadyMail <user@example.com>"); // Адрес и имя отправителя msg.headers.add(rfc822_to, "Recipient <recipient@example.com>"); // Адрес и имя получателя msg.headers.add(rfc822_subject, "Hello from ReadyMail"); // Тема письма msg.text.body("This is a plain text message."); // Тело письма в виде простого текста msg.html.body("<html><body><h1>Hello!</h1></body></html>"); // Тело письма в формате HTML configTime(0, 0, "pool.ntp.org"); // Синхронизация времени через NTP для корректной метки времени письма while (time(nullptr) < 100000) delay(100); // Ожидание синхронизации времени msg.timestamp = time(nullptr); // Установка времени отправки сообщения smtp.send(msg); // Отправка подготовленного сообщения } } void loop() {} |
Откройте мониторинг порта, где увидим показания с датчика.

Открываем вашу электронную почту, где можно увидеть полученное сообщение.

Описание кода
В начале скетча подключаем библиотеки для работы со скетчем. заголовочные файлы.
1 2 |
#include <WiFi.h> #include <ESP_Mail_Client.h> |
В функции setup() запускается последовательный порт на скорости 115200 бод, указываем учетные данные Wi-Fi: имя сети (SSID) и пароль. Подставьте в код свои данные для успешного подключения платы к беспроводной сети и ждем подключение.
1 2 3 |
Serial.begin(115200); WiFi.begin("YOUR_SSID", "YOUR_PASSWORD"); while (WiFi.status() != WL_CONNECTED) delay(500); |
Теперь определим параметры SMTP-сервера: укажите его адрес, порт, а также электронную почту отправителя и пароль от неё. Используйте данные учётной записи, которую вы создали ранее
1 2 3 |
smtp.connect("smtp.yandex.ru", 465, statusCallback); smtp.authenticate("user@example.com", "password", readymail_auth_password); |
Далее необходимо указать электронную почту отправителя и получается.
1 2 |
msg.headers.add(rfc822_from, "ReadyMail <user@example.com>"); msg.headers.add(rfc822_to, "Recipient <recipient@example.com>"); |
Эти строки задают сообщение «Hello!», с темой «This is a plain text message»
1 2 3 |
msg.headers.add(rfc822_subject, "Hello from ReadyMail"); msg.text.body("This is a plain text message."); msg.html.body("<html><body><h1>Hello!</h1></body></html>"); |
Полезные ссылки
| № | Описание | Скачать |
|---|---|---|
| 1 | Библиотека ReadyMail | ReadyMail v.0.4.0.zip |