ESP32 Отправка электронной почты через SMTP-сервер: HTML, текст и вложения (Arduino IDE)
Узнайте, как отправлять электронную почту с ESP32, используя SMTP-сервер. Мы покажем, как отправить простое письмо с HTML или обычным текстом, а также как отправлять вложения — изображения и файлы (.txt). Плата ESP32 будет программироваться с помощью Arduino IDE.
Обновлено 14 июня 2024
В этом руководстве мы рассматриваем следующие темы:
У нас есть аналогичное руководство для платы ESP8266: ESP8266 NodeMCU Send Emails using an SMTP Server: HTML, Text, and Attachments (Arduino)
Введение в SMTP-серверы
SMTP означает Simple Mail Transfer Protocol (простой протокол передачи почты) — это интернет-стандарт для передачи электронной почты. Для отправки писем с помощью ESP32 необходимо подключить его к SMTP-серверу.
Библиотека ESP Mail Client
Для отправки писем с ESP32 мы будем использовать библиотеку ESP-Mail-Client. Эта библиотека позволяет ESP32 отправлять и получать электронную почту с вложениями или без них через серверы SMTP и IMAP.
В этом руководстве мы будем использовать SMTP для отправки электронного письма с вложениями и без них. В качестве примера мы отправим изображение (.png) и текстовый файл (.txt). Файлы, отправляемые по электронной почте, могут быть сохранены в файловой системе ESP32 (SPIFFS, LittleFS или FatFs) или на карте microSD (в данном руководстве не рассматривается).
Установка библиотеки ESP-Mail-Client
Перед тем как продолжить это руководство, необходимо установить библиотеку ESP-Mail-Client.
Перейдите в Sketch > Include Library > Manage Libraries и найдите ESP Mail Client. Установите библиотеку ESP Mail Client by Mobizt.
Электронная почта отправителя (Новый аккаунт)
Мы рекомендуем создать новый аккаунт электронной почты для отправки писем на ваш основной личный адрес. Не используйте свой основной личный адрес электронной почты для отправки писем через ESP32. Если в вашем коде что-то пойдёт не так или вы случайно сделаете слишком много запросов, ваш аккаунт может быть заблокирован или временно отключён.
Мы будем использовать новый аккаунт Gmail.com для отправки писем, но вы можете использовать любой другой почтовый провайдер. Электронная почта получателя может быть вашим личным адресом без каких-либо проблем.
Создание аккаунта отправителя
Создайте новый аккаунт электронной почты для отправки писем с ESP32. Если вы хотите использовать аккаунт Gmail, перейдите по этой ссылке для создания нового аккаунта.
Создание пароля приложения
Вам необходимо создать пароль приложения, чтобы ESP32 мог отправлять электронную почту через ваш аккаунт Gmail. Пароль приложения — это 16-значный код, который предоставляет менее защищённому приложению или устройству разрешение на доступ к вашему аккаунту Google. Узнайте больше о входе с помощью паролей приложений здесь.
Пароль приложения можно использовать только с аккаунтами, в которых включена двухэтапная аутентификация.
Откройте ваш Аккаунт Google.
В панели поиска выберите Security (Безопасность).
В разделе «Signing in to Google» (Вход в Google) выберите 2-Step Verification (Двухэтапная аутентификация) > Get started (Начать).
Следуйте инструкциям на экране.
После включения двухэтапной аутентификации вы можете создать пароль приложения.
Откройте ваш Аккаунт Google.
В панели поиска найдите App Passwords (Пароли приложений).
Откройте меню App Passwords (Пароли приложений).
Задайте имя для пароля приложения, например ESP. Затем нажмите Create (Создать). Появится всплывающее окно с паролем, который вы будете использовать с ESP32 или ESP8266 для отправки электронной почты. Сохраните этот пароль (даже если написано, что вам не нужно его запоминать), потому что он понадобится позже.
Появится всплывающее окно с паролем, который вы будете использовать с ESP32 или ESP8266 для отправки электронной почты. Сохраните этот пароль (даже если написано, что вам не нужно его запоминать), потому что он понадобится позже.
Теперь у вас должен быть пароль приложения, который вы будете использовать в коде ESP для отправки писем.
Если вы используете другого почтового провайдера, проверьте, как создать пароль приложения. Вы сможете найти инструкции с помощью быстрого поиска в Google: «ваш_почтовый_провайдер + create app password».
Настройки SMTP-сервера Gmail
Если вы используете аккаунт Gmail, вот параметры SMTP-сервера:
SMTP-сервер: smtp.gmail.com
Имя пользователя SMTP: Полный адрес Gmail
Пароль SMTP: Ваш пароль Gmail
Порт 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-сервер: smtp.live.com
Имя пользователя SMTP: Полный адрес электронной почты Live/Hotmail
Пароль SMTP: Ваш пароль Windows Live Hotmail
Порт SMTP: 587
SMTP TLS/SSL обязателен: Да
Если вы используете другого почтового провайдера, вам нужно найти его настройки SMTP-сервера. Теперь у вас есть всё необходимое для начала отправки писем с ESP32.
Отправка электронного письма с HTML или обычным текстом с ESP32 (Arduino IDE)
Следующий код отправляет электронное письмо через SMTP-сервер с HTML или обычным текстом. Для демонстрации ESP32 отправляет письмо один раз при загрузке. Затем вы сможете изменить код и интегрировать его в свои проекты.
Не загружайте код пока — вам нужно внести некоторые изменения, чтобы он заработал.
/*
Rui Santos
Complete project details at:
- ESP32: https://RandomNerdTutorials.com/esp32-send-email-smtp-server-arduino-ide/
- ESP8266: https://RandomNerdTutorials.com/esp8266-nodemcu-send-email-smtp-server-arduino/
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.
Example adapted from: https://github.com/mobizt/ESP-Mail-Client
*/
#include <Arduino.h>
#if defined(ESP32)
#include <WiFi.h>
#elif defined(ESP8266)
#include <ESP8266WiFi.h>
#endif
#include <ESP_Mail_Client.h>
#define WIFI_SSID "REPLACE_WITH_YOUR_SSID"
#define WIFI_PASSWORD "REPLACE_WITH_YOUR_PASSWORD"
/** The smtp host name e.g. smtp.gmail.com for GMail or smtp.office365.com for Outlook or smtp.mail.yahoo.com */
#define SMTP_HOST "smtp.gmail.com"
#define SMTP_PORT 465
/* The sign in credentials */
#define AUTHOR_EMAIL "YOUR_EMAIL@XXXX.com"
#define AUTHOR_PASSWORD "YOUR_EMAIL_APP_PASS"
/* Recipient's email*/
#define RECIPIENT_EMAIL "RECIPIENTE_EMAIL@XXXX.com"
/* Declare the global used SMTPSession object for SMTP transport */
SMTPSession smtp;
/* Callback function to get the Email sending status */
void smtpCallback(SMTP_Status status);
void setup(){
Serial.begin(115200);
Serial.println();
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to Wi-Fi");
while (WiFi.status() != WL_CONNECTED){
Serial.print(".");
delay(300);
}
Serial.println();
Serial.print("Connected with IP: ");
Serial.println(WiFi.localIP());
Serial.println();
/* Set the network reconnection option */
MailClient.networkReconnect(true);
/** Enable the debug via Serial port
* 0 for no debugging
* 1 for basic level debugging
*
* Debug port can be changed via ESP_MAIL_DEFAULT_DEBUG_PORT in ESP_Mail_FS.h
*/
smtp.debug(1);
/* Set the callback function to get the sending results */
smtp.callback(smtpCallback);
/* Declare the Session_Config for user defined session credentials */
Session_Config config;
/* Set the session config */
config.server.host_name = SMTP_HOST;
config.server.port = SMTP_PORT;
config.login.email = AUTHOR_EMAIL;
config.login.password = AUTHOR_PASSWORD;
config.login.user_domain = "";
/*
Set the NTP config time
For times east of the Prime Meridian use 0-12
For times west of the Prime Meridian add 12 to the offset.
Ex. American/Denver GMT would be -6. 6 + 12 = 18
See https://en.wikipedia.org/wiki/Time_zone for a list of the GMT/UTC timezone offsets
*/
config.time.ntp_server = F("pool.ntp.org,time.nist.gov");
config.time.gmt_offset = 3;
config.time.day_light_offset = 0;
/* Declare the message class */
SMTP_Message message;
/* Set the message headers */
message.sender.name = F("ESP");
message.sender.email = AUTHOR_EMAIL;
message.subject = F("ESP Test Email");
message.addRecipient(F("Sara"), RECIPIENT_EMAIL);
/*Send HTML message*/
/*String htmlMsg = "<div style=\"color:#2f4468;\"><h1>Hello World!</h1><p>- Sent from ESP board</p></div>";
message.html.content = htmlMsg.c_str();
message.html.content = htmlMsg.c_str();
message.text.charSet = "us-ascii";
message.html.transfer_encoding = Content_Transfer_Encoding::enc_7bit;*/
//Send raw text message
String textMsg = "Hello World! - Sent from ESP board";
message.text.content = textMsg.c_str();
message.text.charSet = "us-ascii";
message.text.transfer_encoding = Content_Transfer_Encoding::enc_7bit;
message.priority = esp_mail_smtp_priority::esp_mail_smtp_priority_low;
message.response.notify = esp_mail_smtp_notify_success | esp_mail_smtp_notify_failure | esp_mail_smtp_notify_delay;
/* Connect to the server */
if (!smtp.connect(&config)){
ESP_MAIL_PRINTF("Connection error, Status Code: %d, Error Code: %d, Reason: %s", smtp.statusCode(), smtp.errorCode(), smtp.errorReason().c_str());
return;
}
if (!smtp.isLoggedIn()){
Serial.println("\nNot yet logged in.");
}
else{
if (smtp.isAuthenticated())
Serial.println("\nSuccessfully logged in.");
else
Serial.println("\nConnected with no Auth.");
}
/* Start sending Email and close the session */
if (!MailClient.sendMail(&smtp, &message))
ESP_MAIL_PRINTF("Error, Status Code: %d, Error Code: %d, Reason: %s", smtp.statusCode(), smtp.errorCode(), smtp.errorReason().c_str());
}
void loop(){
}
/* Callback function to get the Email sending status */
void smtpCallback(SMTP_Status status){
/* Print the current status */
Serial.println(status.info());
/* Print the sending result */
if (status.success()){
// ESP_MAIL_PRINTF used in the examples is for format printing via debug Serial port
// that works for all supported Arduino platform SDKs e.g. AVR, SAMD, ESP32 and ESP8266.
// In ESP8266 and ESP32, you can use Serial.printf directly.
Serial.println("----------------");
ESP_MAIL_PRINTF("Message sent success: %d\n", status.completedCount());
ESP_MAIL_PRINTF("Message sent failed: %d\n", status.failedCount());
Serial.println("----------------\n");
for (size_t i = 0; i < smtp.sendingResult.size(); i++)
{
/* Get the result item */
SMTP_Result result = smtp.sendingResult.getItem(i);
// In case, ESP32, ESP8266 and SAMD device, the timestamp get from result.timestamp should be valid if
// your device time was synched with NTP server.
// Other devices may show invalid timestamp as the device time was not set i.e. it will show Jan 1, 1970.
// You can call smtp.setSystemTime(xxx) to set device time manually. Where xxx is timestamp (seconds since Jan 1, 1970)
ESP_MAIL_PRINTF("Message No: %d\n", i + 1);
ESP_MAIL_PRINTF("Status: %s\n", result.completed ? "success" : "failed");
ESP_MAIL_PRINTF("Date/Time: %s\n", MailClient.Time.getDateTimeString(result.timestamp, "%B %d, %Y %H:%M:%S").c_str());
ESP_MAIL_PRINTF("Recipient: %s\n", result.recipients.c_str());
ESP_MAIL_PRINTF("Subject: %s\n", result.subject.c_str());
}
Serial.println("----------------\n");
// You need to clear sending result as the memory usage will grow up.
smtp.sendingResult.clear();
}
}
Вам необходимо указать ваши сетевые учётные данные, а также настроить электронную почту отправителя, параметры SMTP-сервера, получателя и сообщение.
Как работает код
Этот код адаптирован из примера, предоставленного библиотекой. Пример хорошо прокомментирован, чтобы вы понимали, что делает каждая строка кода. Давайте рассмотрим только те части, которые вам нужно или может потребоваться изменить.
Сначала вставьте ваши сетевые учётные данные в следующие строки:
#define WIFI_SSID "REPLACE_WITH_YOUR_SSID"
#define WIFI_PASSWORD "REPLACE_WITH_YOUR_PASSWORD"
Вставьте настройки вашего SMTP-сервера. Если вы используете аккаунт Gmail для отправки писем, вот настройки:
#define SMTP_HOST "smtp.gmail.com"
#define SMTP_PORT 465
Вставьте учётные данные для входа в почту отправителя (полный адрес электронной почты и пароль приложения, который вы создали ранее).
#define AUTHOR_EMAIL "YOUR_EMAIL@XXXX.com"
#define AUTHOR_PASSWORD "YOUR_EMAIL_PASS"
Вставьте адрес электронной почты получателя:
#define RECIPIENT_EMAIL "RECIPIENTE_EMAIL@XXXX.com"
Вам может потребоваться настроить переменную gmt_offset в зависимости от вашего местоположения, чтобы письмо имело правильную временную метку.
config.time.ntp_server = F("pool.ntp.org,time.nist.gov");
config.time.gmt_offset = 3;
config.time.day_light_offset = 0;
Задайте заголовки сообщения в следующих строках в setup() — имя отправителя, электронная почта отправителя, тема письма, а также имя и адрес получателя:
/* Set the message headers */
message.sender.name = F("ESP");
message.sender.email = AUTHOR_EMAIL;
message.subject = F("ESP Test Email");
message.addRecipient(F("Sara"), RECIPIENT_EMAIL);
В следующих строках задайте содержание сообщения (обычный текст) в переменной textMsg:
//Send raw text message
String textMsg = "Hello World - Sent from ESP board";
message.text.content = textMsg.c_str();
message.text.charSet = "us-ascii";
message.text.transfer_encoding = Content_Transfer_Encoding::enc_7bit;
Если вы хотите отправить HTML-текст вместо обычного, раскомментируйте следующие строки — вы должны вставить свой HTML-текст в переменную htmlMsg.
/*Send HTML message*/
/*String htmlMsg = "<div style=\"color:#2f4468;\"><h1>Hello World!</h1><p>- Sent from ESP board</p></div>";
message.html.content = htmlMsg.c_str();
message.html.content = htmlMsg.c_str();
message.text.charSet = "us-ascii";
message.html.transfer_encoding = Content_Transfer_Encoding::enc_7bit;*/
Наконец, следующие строки отправляют сообщение:
if (!MailClient.sendMail(&smtp, &message))
Serial.println("Error sending Email, " + smtp.errorReason());
Демонстрация
Загрузите код на ваш ESP32. После загрузки откройте Serial Monitor на скорости 115200 бод. Нажмите кнопку Reset на ESP32.
Если всё прошло успешно, вы должны увидеть похожее сообщение в Serial Monitor.
Проверьте ваш почтовый ящик. Вы должны были получить письмо от вашей платы ESP32.
Если вы выбрали вариант отправки сообщения с HTML-текстом, вот как выглядит сообщение:
Если вы включили отправку обычного текста, вот письмо, которое вы должны получить:
Отправка вложений по электронной почте с ESP32 (Arduino IDE)
В этом разделе мы покажем, как отправлять вложения в письмах, отправляемых ESP32. Мы покажем, как отправлять файлы .txt или изображения. Это может быть полезно для отправки файла .txt с показаниями датчиков за последние несколько часов или для отправки фотографии, сделанной ESP32-CAM.
Для этого руководства файлы, которые нужно отправить, должны быть сохранены в файловой системе ESP32 (LittleFS).
Загрузка файлов в LittleFS
Для отправки файлов по электронной почте они должны быть сохранены в файловой системе ESP32 или на карте microSD. Мы загрузим изображение и .txt-файл в файловую систему ESP32 LittleFS с помощью плагина ESP32 Filesystem Uploader для Arduino IDE. Следуйте этому руководству для установки плагина, если он ещё не установлен:
Создайте новый скетч Arduino и сохраните его. Перейдите в Sketch > Show Sketch folder. Внутри папки скетча Arduino создайте папку с именем data. Переместите файл .jpg и .txt в папку data.
Альтернативно, вы можете нажать здесь, чтобы скачать папку проекта.
Примечание
При использовании кода по умолчанию ваши файлы должны называться image.png и text_file.txt. Кроме того, вы можете изменить код для импорта файлов с другим именем.
Мы будем отправлять эти файлы:
Структура папки должна выглядеть следующим образом (скачать папку проекта):
После перемещения файлов в папку data вам нужно загрузить их на плату. В Arduino IDE нажмите [Ctrl] + [Shift] + [P] в Windows или [Cmd] + [Shift] + [P] в MacOS, чтобы открыть палитру команд. Найдите команду Upload LittleFS to Pico/ESP8266/ESP32 и нажмите на неё.
Вы должны получить сообщение об успешной загрузке в окне отладки. Если файлы были успешно загружены, переходите к следующему разделу.
Примечание
Если вы начнёте видеть множество точек ….____….____ в окне отладки, вам нужно удерживать кнопку BOOT на плате ESP32, чтобы файлы были загружены.
Код
Следующий код отправляет электронное письмо с прикреплённым файлом .txt и изображением. Перед загрузкой кода убедитесь, что вы указали настройки электронной почты отправителя и адрес получателя.
/*
Rui Santos
Complete project details at:
- ESP32: https://RandomNerdTutorials.com/esp32-send-email-smtp-server-arduino-ide/
- ESP8266: https://RandomNerdTutorials.com/esp8266-nodemcu-send-email-smtp-server-arduino/
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.
Example adapted K. Suwatchai (Mobizt): https://github.com/mobizt/ESP-Mail-Client Copyright (c) 2021 mobizt
*/
// To use send Email for Gmail to port 465 (SSL), less secure app option should be enabled. https://myaccount.google.com/lesssecureapps?pli=1
#include <Arduino.h>
#if defined(ESP32)
#include <WiFi.h>
#elif defined(ESP8266)
#include <ESP8266WiFi.h>
#endif
#include <ESP_Mail_Client.h>
#define WIFI_SSID "REPLACE_WITH_YOUR_SSID"
#define WIFI_PASSWORD "REPLACE_WITH_YOUR_PASSWORD"
#define SMTP_HOST "smtp.gmail.com"
/** The smtp port e.g.
* 25 or esp_mail_smtp_port_25
* 465 or esp_mail_smtp_port_465
* 587 or esp_mail_smtp_port_587
*/
#define SMTP_PORT 465
/* The sign in credentials */
#define AUTHOR_EMAIL "YOUR_EMAIL@XXXX.com"
#define AUTHOR_PASSWORD "YOUR_EMAIL_APP_PASS"
/* Recipient's email*/
#define RECIPIENT_EMAIL "RECIPIENTE_EMAIL@XXXX.com"
/* The SMTP Session object used for Email sending */
SMTPSession smtp;
/* Callback function to get the Email sending status */
void smtpCallback(SMTP_Status status);
void setup(){
Serial.begin(115200);
Serial.println();
Serial.print("Connecting to AP");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED){
Serial.print(".");
delay(200);
}
Serial.println("");
Serial.println("WiFi connected.");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
Serial.println();
// Init filesystem
ESP_MAIL_DEFAULT_FLASH_FS.begin();
/** Enable the debug via Serial port
* none debug or 0
* basic debug or 1
*/
smtp.debug(1);
/* Set the callback function to get the sending results */
smtp.callback(smtpCallback);
/* Declare the Session_Config for user defined session credentials */
Session_Config config;
/* Set the session config */
config.server.host_name = SMTP_HOST;
config.server.port = SMTP_PORT;
config.login.email = AUTHOR_EMAIL;
config.login.password = AUTHOR_PASSWORD;
config.login.user_domain = "mydomain.net";
/*
Set the NTP config time
For times east of the Prime Meridian use 0-12
For times west of the Prime Meridian add 12 to the offset.
Ex. American/Denver GMT would be -6. 6 + 12 = 18
See https://en.wikipedia.org/wiki/Time_zone for a list of the GMT/UTC timezone offsets
*/
config.time.ntp_server = F("pool.ntp.org,time.nist.gov");
config.time.gmt_offset = 3;
config.time.day_light_offset = 0;
/* Declare the message class */
SMTP_Message message;
/* Enable the chunked data transfer with pipelining for large message if server supported */
message.enable.chunking = true;
/* Set the message headers */
message.sender.name = "ESP Mail";
message.sender.email = AUTHOR_EMAIL;
message.subject = F("Test sending Email with attachments and inline images from Flash");
message.addRecipient(F("Sara"), RECIPIENT_EMAIL);
/** Two alternative content versions are sending in this example e.g. plain text and html */
String htmlMsg = "This message contains attachments: image and text file.";
message.html.content = htmlMsg.c_str();
message.html.charSet = "utf-8";
message.html.transfer_encoding = Content_Transfer_Encoding::enc_qp;
message.priority = esp_mail_smtp_priority::esp_mail_smtp_priority_normal;
message.response.notify = esp_mail_smtp_notify_success | esp_mail_smtp_notify_failure | esp_mail_smtp_notify_delay;
/* The attachment data item */
SMTP_Attachment att;
/** Set the attachment info e.g.
* file name, MIME type, file path, file storage type,
* transfer encoding and content encoding
*/
att.descr.filename = "image.png";
att.descr.mime = "image/png"; //binary data
att.file.path = "/image.png";
att.file.storage_type = esp_mail_file_storage_type_flash;
att.descr.transfer_encoding = Content_Transfer_Encoding::enc_base64;
/* Add attachment to the message */
message.addAttachment(att);
message.resetAttachItem(att);
att.descr.filename = "text_file.txt";
att.descr.mime = "text/plain";
att.file.path = "/text_file.txt";
att.file.storage_type = esp_mail_file_storage_type_flash;
att.descr.transfer_encoding = Content_Transfer_Encoding::enc_base64;
/* Add attachment to the message */
message.addAttachment(att);
/* Connect to server with the session config */
if (!smtp.connect(&config)){
ESP_MAIL_PRINTF("Connection error, Status Code: %d, Error Code: %d, Reason: %s", smtp.statusCode(), smtp.errorCode(), smtp.errorReason().c_str());
return;
}
if (!smtp.isLoggedIn()){
Serial.println("\nNot yet logged in.");
}
else{
if (smtp.isAuthenticated())
Serial.println("\nSuccessfully logged in.");
else
Serial.println("\nConnected with no Auth.");
}
/* Start sending the Email and close the session */
if (!MailClient.sendMail(&smtp, &message, true))
Serial.println("Error sending Email, " + smtp.errorReason());
}
void loop(){
}
/* Callback function to get the Email sending status */
void smtpCallback(SMTP_Status status){
/* Print the current status */
Serial.println(status.info());
/* Print the sending result */
if (status.success()){
Serial.println("----------------");
ESP_MAIL_PRINTF("Message sent success: %d\n", status.completedCount());
ESP_MAIL_PRINTF("Message sent failled: %d\n", status.failedCount());
Serial.println("----------------\n");
struct tm dt;
for (size_t i = 0; i < smtp.sendingResult.size(); i++){
/* Get the result item */
SMTP_Result result = smtp.sendingResult.getItem(i);
time_t ts = (time_t)result.timestamp;
localtime_r(&ts, &dt);
ESP_MAIL_PRINTF("Message No: %d\n", i + 1);
ESP_MAIL_PRINTF("Status: %s\n", result.completed ? "success" : "failed");
ESP_MAIL_PRINTF("Date/Time: %d/%d/%d %d:%d:%d\n", dt.tm_year + 1900, dt.tm_mon + 1, dt.tm_mday, dt.tm_hour, dt.tm_min, dt.tm_sec);
ESP_MAIL_PRINTF("Recipient: %s\n", result.recipients.c_str());
ESP_MAIL_PRINTF("Subject: %s\n", result.subject.c_str());
}
Serial.println("----------------\n");
// You need to clear sending result as the memory usage will grow up.
smtp.sendingResult.clear();
}
}
Как работает код
Этот код очень похож на предыдущий, поэтому мы рассмотрим только те части, которые относятся к отправке вложений.
В setup() вы инициализируете файловую систему с помощью метода библиотеки ESP Mail Client. Файловая система по умолчанию, установленная в библиотеке для ESP32, — это LittleFS (вы можете изменить значение по умолчанию в файле библиотеки ESP_Mail_FS.h).
// Init filesystem
ESP_MAIL_DEFAULT_FLASH_FS.begin();
Вам нужно создать объект вложения следующим образом:
/* The attachment data item */
SMTP_Attachment att;
Затем добавьте данные о вложении: имя файла, MIME-тип, путь к файлу, тип хранилища файла и кодировку передачи. В следующих строках мы отправляем файл изображения.
att.descr.filename = "image.png";
att.descr.mime = "image/png";
att.file.path = "/image.png";
att.file.storage_type = esp_mail_file_storage_type_flash;
att.descr.transfer_encoding = Content_Transfer_Encoding::enc_base64;
Наконец, добавьте вложение к сообщению:
message.addAttachment(att);
Если вы хотите отправить больше вложений, вам нужно вызвать следующую строку перед добавлением следующего вложения:
message.resetAttachItem(att);
Затем введите данные другого вложения (текстовый файл):
att.descr.filename = "text_file.txt";
att.descr.mime = "text/plain";
att.file.path = "/text_file.txt";
att.file.storage_type = esp_mail_file_storage_type_flash;
att.descr.transfer_encoding = Content_Transfer_Encoding::enc_base64;
И добавьте это вложение к сообщению:
message.addAttachment(att);
Наконец, вам нужно просто отправить сообщение, как вы делали в предыдущем примере:
if (!MailClient.sendMail(&smtp, &message, true))
Serial.println("Error sending Email, " + smtp.errorReason());
Демонстрация
После загрузки кода откройте Serial Monitor на скорости 115200 бод и нажмите кнопку EN/RESET на плате. Если всё прошло гладко, вы должны получить похожее сообщение в Serial Monitor.
Проверьте адрес электронной почты получателя. У вас должно быть новое письмо с двумя вложениями.
Заключение
В этом руководстве вы узнали, как отправлять электронную почту с ESP32, используя SMTP-сервер. Для работы этого метода ESP32 должен иметь доступ к интернету.
Если вы не хотите использовать SMTP-сервер, вы также можете написать PHP-скрипт для отправки уведомлений по электронной почте с ESP32 или ESP8266.
Вы узнали, как отправить простое письмо с текстом и с вложениями. При использовании вложений они должны быть сохранены в файловой системе ESP32 (LittleFS) или на карте microSD (в данном руководстве не рассматривается).
Представленные примеры показывают, как отправить одно письмо при загрузке ESP32. Идея состоит в том, чтобы модифицировать код и включить его в ваши собственные проекты. Например, это может быть полезно для отправки .txt файла с показаниями датчиков, отправки фотографии, сделанной ESP32-CAM, использования глубокого сна для пробуждения платы каждый час и отправки письма с данными и т.д.
Надеемся, что это руководство было для вас интересным.
Чтобы узнать больше об ESP32, ознакомьтесь с нашими ресурсами:
Спасибо за чтение.
Источник: ESP32 Send Emails using an SMTP Server: HTML, Text, and Attachments (Arduino IDE)