В данном руководстве мы объясним, как отправлять электронные письма с обычным или HTML текстом, а также расскажем, как отправлять вложения, такие как изображения и текстовые файлы. Плату ESP32 будем программировать с помощью среды разработки Arduino.
Знакомство с SMTP-серверами
SMTP – простой протокол передачи почты (simple mail transfer protocol) и является интернет-стандартом для передачи электронной почты. Чтобы отправлять электронные письма с помощью ESP32, необходимо подключить его к SMTP-серверу.
Библиотека ESP32 MailClient
Для отправки электронных писем с ESP32 используется библиотека ESP32 MailClient . Эта библиотека позволяет ESP32 отправлять и получать электронные письма с вложениями или без них через серверы SMTP и IMAP.
В этом руководстве мы будем использовать SMTP для отправки электронной почты. В качестве примера мы отправим изображение ( .jpg ) и текстовый ( .txt ) файл. Файлы для отправки по электронной почте можно хранить в ESP32 SPIFFS или SD-карте .
Установка библиотеки ESP32 MailClient
Прежде чем продолжить изучать это руководство, необходимо установить библиотеку ESP32 MailClient. Эту библиотеку можно установить с помощью диспетчера библиотек Arduino IDE.
В среде разработки перейдите в Скетч > Подключить библиотеку > Управлять библиотеками…
Должен открыться менеджер библиотек. Найдите почтовый клиент ESP32 от Mobizt и установите библиотеку, как показано ниже.
Электронная почта отправителя (новая учетная запись)
Рекомендуется создать новую учетную запись электронной почты, чтобы отправлять письма на ваш основной адрес электронной почты.
Не используйте свой основной личный адрес электронной почты для отправки электронных писем через ESP32.
Если что-то будет не так в вашем коде или если вы по ошибке сделаете слишком много запросов, вас могут забанить или временно отключить вашу учетную запись.
Мы будем использовать учетную запись gmail для отправки электронных писем, но вы можете использовать любую другую почту. Электронный адрес получателя также может быть вашим личным адресом электронной почты.
Как создать и настроить учетную запись электронной почты отправителя?
Создайте новую учетную запись электронной почты для отправки электронных писем с помощью ESP32.
Разрешите небезопасные приложения
Разрешите небезопасным приложениям получать доступ к этой новой учетной записи Gmail, чтобы вы могли отправлять электронные письма.
Скопируйте настройки SMTP-сервера
Настройки SMTP-сервера gmail
Если вы используете учетную запись gmail, то вот данные SMTP-сервера:
SMTP-сервер: smtp.gmail.com
Имя пользователя SMTP: полный адрес почты gmail
Пароль SMTP: ваш пароль от почты.
Порт SMTP (TLS): 587
Порт SMTP (SSL): 465
Требуется SMTP TLS / SSL: да
Настройки SMTP-сервера Outlook
Для учетных записей Outlook настройки SMTP-сервера такие:
SMTP-сервер: smtp.office365.com
Имя пользователя SMTP: полный адрес электронной почты Outlook
Пароль SMTP: ваш пароль от Outlook.
Порт SMTP: 587
Требуется SMTP TLS / SSL: Да
Настройки SMTP-сервера Live или Hotmail
Настройки ля учетных записей Live или Hotmail:
SMTP-сервер: smtp.live.com
Имя пользователя SMTP: Полный адрес электронной почты Live / Hotmail
Пароль SMTP: ваш пароль от Windows Live Hotmail.
Порт SMTP: 587
Требуется SMTP TLS / SSL: Да
Если вы используете другую почту, вам нужно найти его настройки SMTP-сервера. Теперь мы готовы для отправки электронных писем с помощью ESP32.
Как отправить электронное письмо с текстом используя ESP32?
Данный код отправляет электронное письмо через SMTP-сервер с текстом (обычным или на HTML). В демонстрационных целях ESP32 отправляет электронное письмо один раз при загрузке платы. Изменить код и интегрировать его в свои собственные проекты не сложно.
Прежде чем копировать код, вам нужно внести некоторые изменения, чтобы он работал у вас.
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 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
/* Rui Santos Complete project details at https://RandomNerdTutorials.com/esp32-send-email-smtp-server-arduino-ide/ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. */ #include "ESP32_MailClient.h" // замените на свои учетные данные const char* ssid = "укажите свой SSID"; const char* password = "укажите пароль"; // Чтобы послать письмо через gmail используйте порт 465 (SSL) и SMTP-сервер smtp.gmail.com // Вам необходимо разрешить работу небезопасных приложений https://myaccount.google.com/lesssecureapps?pli=1 //Введите здесь свои данные #define emailSenderAccount "логин_отправителя@gmail.com" #define emailSenderPassword "Пароль почты-отправителя" #define emailRecipient "логин_получателя@EXAMPLE.com" #define smtpServer "smtp.gmail.com" #define smtpServerPort 465 #define emailSubject "ESP32 Test" // Файл для отправки по электронной почте содержит конфигурацию и данные для отправки. SMTPData smtpData; // Обратная функция для получения статуса отправки письма void sendCallback(SendStatus info); void setup(){ Serial.begin(115200); Serial.println(); Serial.print("Соединение"); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(200); } Serial.println(); Serial.println("Подключение к WiFi."); Serial.println(); Serial.println("Подготовка к отправке"); Serial.println(); // Укажите хост и порт SMTP-сервера, логин и пароль почты-отправителя smtpData.setLogin(smtpServer, smtpServerPort, emailSenderAccount, emailSenderPassword); // Для библиотек версии 1.2.0 и новее, поддерживающих протокол STARTTLS, STARTTLS будет работать // Подключается автоматически, если используется порт 587, но также можно включить вручную используя следующую функцию: //smtpData.setSTARTTLS(true); // Указываем адрес почты-получателя smtpData.setSender("ESP32", emailSenderAccount); // Указываем приоритет письма (Высокий, Обычный, Низкий или от 1 до 5(1-наивысший)) smtpData.setPriority("High"); // Указываем тему письма smtpData.setSubject(emailSubject); // Пишем сообщение в формате HTML smtpData.setMessage("<div style=\"color:#2f4468;\"><h1>Hello World!</h1> <p>- Sent from ESP32 board</p></div>", true); // Пишем сообщение обычным текстом //smtpData.setMessage("Hello World! - Sent from ESP32 board", false); // Добавляем еще получателей, если нужно. smtpData.addRecipient(emailRecipient); //smtpData.addRecipient("ещё_адрес_получателя@EXAMPLE.com"); smtpData.setSendCallback(sendCallback); // Начинаем отправку письма, можно установить обратную функцию для отслеживания статуса if (!MailClient.sendMail(smtpData)) Serial.println("Ошибка отправки, " + MailClient.smtpErrorReason()); //Очищаем память smtpData.empty(); } void loop() { } // Обратная функция для получения статуса отправки письма void sendCallback(SendStatus msg) { // Выводим текущий статус Serial.println(msg.info()); // Что-нибудь выводим, чтобы проверить, работает ли код. if (msg.success()) { Serial.println("----------------"); } } |
Вам необходимо ввести свои учетные данные сети, а также указать адрес электронной почты отправителя, данные SMTP-сервера, получателя и сообщение.
Как работает код?
Подключаем библиотеку ESP32_MailClient.h
1 |
#include "ESP32_MailClient.h" |
Подставляем свои учетные данные в следующие переменные, чтобы ESP32 мог подключиться к вашей почте для отправки электронных писем.
1 2 3 |
// Укажите свои данные const char* ssid = "укажите_свой_ssid"; const char* password = "укажите_пароль"; |
Указываем логин отправителя электронной почты в emailSenderAccount и пароль от нее в emailSenderPassword.
1 2 |
#define emailSenderAccount "логин_отправителя@gmail.com" #define emailSenderPassword "пароль_отправителя" |
Указываем адрес электронной почты получателя. Это почта, на которую будут приходить электронные письма, отправленные ESP32:
1 |
#define emailRecipient "логин_получателя@gmail.com" |
Указываем настройки SMTP вашей почты в следующие строки (мы используем настройки для учетной записи gmail):
1 2 |
#define smtpServer "smtp.gmail.com" #define smtpServerPort 465 |
Указываем тему письма:
1 |
#define emailSubject "ESP32 Test" |
Создаем объект STMPData под названием smtpData с данными для отправки по почте.
1 |
SMTPData smtpData; |
Подключаем ESP32 к Wi-Fi.
1 2 3 4 5 |
WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(200); } |
В следующей строке задаются хост SMTP-сервера, порт SMTP, логин и пароль, используемые для входа в систему:
1 |
smtpData.setLogin(smtpServer, smtpServerPort, emailSenderAccount, emailSenderPassword); |
Задаём имя отправителя и адрес электронной почты отправителя. В этом случае мы устанавливаем имя отправителя на ESP32.
1 |
smtpData.setSender("ESP32", emailSenderAccount); |
Устанавливаем приоритет электронной почты:
1 |
smtpData.setPriority("High"); |
Указываем тему электронного письма.
1 |
smtpData.setSubject(emailSubject); |
Следующая строка создает сообщение. Вы можете отправить текст в формате HTML или обычный текст. В данном случае мы отправляем сообщение с кодом HTML.
1 2 |
smtpData.setMessage("<div style=\"color:#2f4468;\"><h1>Hello World!</h1> <p>- Sent from ESP32 board</p></div>", true); |
При отправке сообщения в формате HTML необходимо в качестве второго параметра в методе
1 |
setMessage () |
указать
1 |
true |
Если вы хотите отправить обычный текст, указываем
1 |
false |
1 |
//smtpData.setMessage("Hello World! - Sent from ESP32 board", false); |
Наконец, устанавливаем адрес электронной почты получателя.
1 |
smtpData.addRecipient(почта_получатель); |
Теперь, когда мы определили все параметры smtpData, мы готовы отправить письмо.
1 2 |
if (!MailClient.sendMail(smtpData)) Serial.println("Ошибка отправки, " + MailClient.smtpErrorReason()); |
После отправки электронного письма вы можете удалить все данные из smtpData.
1 |
smtpData.empty(); |
В данном примере электронное письмо отправляется один раз при загрузке ESP32, поэтому loop() пустая.
1 2 |
void loop() { } |
Демонстрация
Загрузите код в свой ESP32. После загрузки откройте монитор порта со скоростью 115200 бод. Нажмите кнопку сброса ESP32.
Если все прошло удачно, вы должны получить аналогичное сообщение в мониторе порта.
Проверьте свою электронную почту. Вы должны были получить электронное письмо от вашей платы.
Если вы отправите сообщение с текстом HTML, оно будет выглядеть вот так:
Если вы отправили обычное сообщение, вы должны получить такое электронное письмо.
Отправка вложений по электронной почте с помощью ESP32
Отправляемые файлы должны быть сохранены в ESP32 SPIFFS или на карте microSD. В этом примере мы будем использовать SPIFFS (код возможно изменить для использования карты microSD).
Загружаем файлы в SPIFFS
Загрузим изображение и файл .txt в ESP32 SPIFFS с помощью плагина ESP32 Filesystem Uploader для среды разработки Arduino .
Создайте новый скетч Arduino и сохраните его. Перейдите в Скетч > Показать папку скетча. Внутри папки скетчей создайте папку с именем data . Переместите файл jpg и файл .txt в эту папку.
Примечание: с кодом по умолчанию ваши файлы должны называться ESP32-CAM-Test.jpg и text_file.txt, или вы можете изменить код для импорта файлов с другим именем.
Ваша структура папок должна выглядеть следующим образом
После перемещения файлов в папку данных в IDE Arduino перейдите в Инструменты > Загрузка скетча данных ESP32 и дождитесь загрузки файлов.
Вы должны получить сообщение об успешном выполнении в окне отладки. Если файлы были успешно загружены, переходите к следующему разделу.
Примечание: если вы увидели много точек… .____… ..____, которые выводятся в окне отладки, вам нужно нажать и удерживать кнопку BOOT ESP32 для загрузки файлов.
Код
Данный код отправляет электронное письмо с файлом .txt и прикрепленным изображением. Перед загрузкой кода убедитесь, что вы указали учетные данные почты отправителя, а также адрес почты получателя.
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 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
/* Rui Santos Complete project details at https://RandomNerdTutorials.com/esp32-send-email-smtp-server-arduino-ide/ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. */ #include "ESP32_MailClient.h" #include "SD.h" #include "SPIFFS.h" // Укажите свои учетные данные сети const char* ssid = "укажите свой SSID"; const char* password = "Укажите пароль"; // Чтобы послать письмо через gmail используйте порт 465 (SSL) и SMTP-сервер smtp.gmail.com // Вам необходимо разрешить работу небезопасных приложений https://myaccount.google.com/lesssecureapps?pli=1 #define emailSenderAccount "почта_отправитель@gmail.com" #define emailSenderPassword "пароль_почты_отправителя" #define emailRecipient "почта_получатель@EXAMPLE.com" #define smtpServer "smtp.gmail.com" #define smtpServerPort 465 #define emailSubject "ESP32 Test Email with Attachments" // Файл, содержащий настройки и данные для отправки SMTPData smtpData; // Обратная функция для получения статуса отправки void sendCallback(SendStatus info); void setup(){ Serial.begin(115200); Serial.println(); // Initialize SPIFFS if(!SPIFFS.begin(true)) { Serial.println("Произошла ошибка при запуске SPIFFS"); return; } // Или читаем с SD карты (строки запуска SPIFFS сделать комментариями) /* MailClient.sdBegin(14, 2, 15, 13); // (SCK, MISO, MOSI, SS) if(!SD.begin()){ Serial.println("Чтение с карты не удалось"); return ""; }*/ Serial.print("Подключение"); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(200); } Serial.println(); Serial.println("WiFi подключен."); Serial.println(); Serial.println("Подготовка к отправке сообщения"); Serial.println(); // Указываем хост и порт SMTP-сервера, а также логин и пароль от почты smtpData.setLogin(smtpServer, smtpServerPort, emailSenderAccount, emailSenderPassword); // Для библиотек версии 1.2.0 и новее, поддерживающих протокол STARTTLS, STARTTLS будет работать // Подключается автоматически, если используется порт 587, но также можно включить вручную используя следующую функцию: //smtpData.setSTARTTLS(true); // Указываем имя и логин отправителя smtpData.setSender("ESP32", emailSenderAccount); // Устанавливаем приоритет отправки smtpData.setPriority("High"); // Указываем тему письма smtpData.setSubject(emailSubject); // Создаем сообщение с кодом HTML smtpData.setMessage("<div style=\"color:#2f4468;\"><h1>Hello World!</h1><p>- Sent from ESP32 board</p></div>", true); // Создаем сообщение с обычным текстом //smtpData.setMessage("Hello World! - Sent from ESP32 board", false); // Добавляем получателей, если необходимо smtpData.addRecipient(emailRecipient); //smtpData.addRecipient("адрес_получателя@example.com"); // Добавляем файлы с SD карты или SPIFFS // Закомментируйте следующие две строки, если файлы SPIFFS не созданы или SD-карта не подключена. smtpData.addAttachFile("/ESP32-CAM-Test.jpg", "image/jpg"); smtpData.addAttachFile("/text_file.txt"); // Добавляем заголовок к сообщению // Указываем тип хранения данных (SPIFFS или SD Card) smtpData.setFileStorageType(MailClientStorageType::SPIFFS); //smtpData.setFileStorageType(MailClientStorageType::SD); smtpData.setSendCallback(sendCallback); //Отправляем письмо, с помощью обратной функции получаем обратную связь if (!MailClient.sendMail(smtpData)) Serial.println("Ошибка отправки, " + MailClient.smtpErrorReason()); //Освобождаем память smtpData.empty(); } void loop() { } // Обратная функция для получения статуса отправки void sendCallback(SendStatus msg) { // Выводим текущий статус Serial.println(msg.info()); // Что-нибудь выводим, если все работает if (msg.success()) { Serial.println("----------------"); } } |
Как работает код?
Этот код очень похож на предыдущий, поэтому мы просто рассмотрим соответствующие части для отправки вложений.
в setup(), вам необходимо инициализировать SPIFFS:
1 2 3 4 5 6 7 |
if(!SPIFFS.begin(true)) { Serial.println("Ошибка при запуске SPIFFS"); return; } |
Если вы хотите отправить файлы, сохраненные на карте microSD, раскомментируйте следующие строки (убедитесь, что вы правильно назначили пины для карты microSD):
1 2 3 4 5 6 7 8 9 10 11 |
/* MailClient.sdBegin(14, 2, 15, 13); // (SCK, MISO, MOSI, SS) if(!SD.begin()){ Serial.println("Чтение с карты не удалось"); return ""; }*/ |
Затем, чтобы прикрепить файл, вам просто нужно вызвать addAtatachFile () на smtpData и передать в качестве аргумента путь к файлу. Например, изображение, которое мы отправляем, называется ESP32-CAM-Test.jpg, поэтому отправьте его следующим образом:
1 |
smtpData.addAttachFile("/ESP32-CAM-Test.jpg", "image/jpg"); |
Текстовый файл, который нужно отправить, называется text_file.txt:
1 |
smtpData.addAttachFile("/text_file.txt"); |
Если требуется отправлять разные файлы, вам просто нужно изменить путь.
Наконец, нужно указать, где будут сохраняться файлы (SPIFFS или SD-карта). Мы используем SPIFFS:
1 |
smtpData.setFileStorageType(MailClientStorageType::SPIFFS); |
Если нужно использовать SD-карту, закомментируем предыдущую строку и раскомментируем следующую:
1 |
//smtpData.setFileStorageType(MailClientStorageType::SD); |
Вот и все! Как видите, код для отправки вложения по электронной почте очень прост.
Демонстрация
После загрузки кода откройте монитор порта со скоростью 115200 бод и нажмите встроенную кнопку EN / RESET. Если все пройдет гладко, вы должны получить аналогичное сообщение на мониторе порта.
Проверьте адрес электронной почты получателя. У вас должно быть новое письмо с двумя вложениями.
Заключение
В этом руководстве вы узнали, как отправлять электронные письма с помощью ESP32, используя SMTP-сервер.
Вы узнали, как отправить простое электронное письмо с текстом и вложениями. При использовании вложений их следует сохранять на SD-карте или в SPIFFS .
Основная задача данного руководства состоит в том, чтобы вы могли использовать код в своих проектах.
Мы надеемся, что этот урок вам понравился.
Вопросы по прошивке и работе с кодом лучше писать напрямую автору в комментариях к статье (на англ. языке)
1 комментарий. Оставить новый
Статья более не актуальна. Гугл запретил использовать ненадёжные приложения для отправки почты.