ESP8266 NodeMCU: отправка электронной почты через SMTP-сервер — HTML, текст и вложения (Arduino)

В этом руководстве вы узнаете, как отправлять электронные письма с платы ESP8266 NodeMCU с использованием SMTP-сервера. Мы покажем, как отправить письмо с обычным текстом, HTML-текстом, а также как отправлять вложения, такие как изображения и файлы (.txt). Мы будем программировать плату ESP8266 NodeMCU с помощью ядра Arduino.

ESP8266 NodeMCU отправка электронной почты через SMTP-сервер HTML текст и вложения Arduino IDE

Обновлено 12 апреля 2025 г.

В этом руководстве мы рассмотрим следующие темы:

У нас есть аналогичное руководство для платы ESP32: ESP32: отправка электронной почты через SMTP-сервер — HTML, текст и вложения (Arduino IDE)

Введение в SMTP-серверы

SMTP означает Simple Mail Transfer Protocol (простой протокол передачи почты) — это интернет-стандарт для передачи электронной почты. Для отправки электронных писем с помощью ESP8266 необходимо подключить его к SMTP-серверу.

Библиотека ESP-Mail-Client

Для отправки электронных писем с платой ESP8266 NodeMCU мы будем использовать библиотеку ESP-Mail-Client. Эта библиотека позволяет ESP8266 отправлять и получать электронные письма с вложениями или без них через серверы SMTP и IMAP. Если вам нравится эта библиотека и вы будете использовать её в своих проектах, рассмотрите возможность поддержки работы разработчика — см. страницу библиотеки на GitHub.

В этом руководстве мы будем использовать SMTP для отправки электронного письма с вложениями и без них. В качестве примера мы отправим изображение (.png) и текстовый файл (.txt). Файлы для отправки по электронной почте можно сохранить в файловой системе ESP8266 (SPIFFS или LittleFS) или на карте microSD (в данном руководстве это не рассматривается).

Установка библиотеки ESP-Mail-Client

Перед тем как продолжить это руководство, вам необходимо установить библиотеку ESP-Mail-Client.

Перейдите в Sketch > Include Library > Manage Libraries и найдите ESP Mail Client. Установите библиотеку ESP Mail Client от Mobizt.

Установка библиотеки ESP Mail Client Arduino IDE

Создание учётной записи отправителя (новый аккаунт)

Мы рекомендуем создать новую учётную запись электронной почты для отправки писем на ваш основной личный адрес. Не используйте ваш основной личный email для отправки писем через ESP8266. Если в вашем коде что-то пойдёт не так или если по ошибке вы сделаете слишком много запросов, ваш аккаунт может быть заблокирован или временно отключён.

Создайте новую учётную запись электронной почты для отправки писем с ESP8266. Если вы хотите использовать аккаунт Gmail, перейдите по этой ссылке для создания нового.

Gmail создание нового аккаунта

Создание пароля приложения

Вам необходимо создать пароль приложения, чтобы ESP8266 мог отправлять электронные письма с вашего аккаунта Gmail. Пароль приложения — это 16-значный код, который даёт менее защищённому приложению или устройству разрешение на доступ к вашему аккаунту Google. Узнайте больше о входе с паролями приложений здесь.

Пароль приложения можно использовать только с аккаунтами, у которых включена двухэтапная аутентификация.

  1. Откройте ваш аккаунт Google.

  2. В панели навигации выберите Security (Безопасность).

  3. В разделе «Signing in to Google» (Вход в Google) выберите 2-Step Verification (Двухэтапная аутентификация) > Get started (Начать).

  4. Следуйте инструкциям на экране.

После включения двухэтапной аутентификации вы можете создать пароль приложения.

  1. Откройте ваш аккаунт Google.

  2. В панели поиска найдите App Passwords (Пароли приложений).

  3. Откройте меню App Passwords (Пароли приложений).

Аккаунт Google — создание пароля приложения для отправки email с ESP32
  1. Дайте имя паролю приложения, например ESP. Затем нажмите на Create (Создать). Появится окно с паролем, который вы будете использовать с ESP32 или ESP8266 для отправки писем. Сохраните этот пароль (даже если написано, что вам не нужно его запоминать), потому что он понадобится вам позже.

Создание пароля приложения для использования с ESP

Появится окно с паролем, который вы будете использовать с ESP8266 для отправки электронных писем. Сохраните этот пароль (даже если написано, что вам не нужно его запоминать), потому что он понадобится вам позже.

Сгенерированный пароль приложения аккаунта Google

Теперь у вас должен быть пароль приложения, который вы будете использовать в коде ESP8266 для отправки электронных писем.

Пароль приложения Gmail создан для отправки email с ESP32

Если вы используете другого поставщика электронной почты, проверьте, как создать пароль приложения. Вы должны иметь возможность сделать это.

Настройки 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-сервера. Теперь у вас есть всё необходимое, чтобы начать отправлять электронные письма с вашего ESP8266.

В Arduino IDE вы можете перейти в File > Examples > ESP-Mail-Client и поэкспериментировать с предоставленными примерами — вам нужно ввести данные вашей электронной почты (аккаунты отправителя и получателя), настройки SMTP-сервера, а также ваш SSID и пароль.


ESP8266: отправка Email (HTML и обычный текст)

Следующий код отправляет электронное письмо через SMTP-сервер с HTML или обычным текстом. В качестве примера ESP8266 отправляет письмо один раз при загрузке. Затем вы сможете модифицировать код и интегрировать его в свои собственные проекты.

Не загружайте код пока, вам нужно внести некоторые изменения, чтобы он работал у вас.

/*
  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();
  }
}

Посмотреть исходный код

Вам нужно ввести свои сетевые учётные данные и настроить email отправителя, параметры 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

Введите учётные данные для входа в email отправителя (полный адрес электронной почты и пароль приложения, который вы создали ранее):

#define AUTHOR_EMAIL "YOUR_EMAIL@XXXX.com"
#define AUTHOR_PASSWORD "YOUR_EMAIL_PASS"

Введите email получателя:

#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() — имя отправителя, email отправителя, тему письма, а также имя и email получателя:

/* Set the message headers */
message.sender.name = "ESP";
message.sender.email = AUTHOR_EMAIL;
message.subject = "ESP Test Email";
message.addRecipient("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());

Демонстрация

Загрузите код на ваш ESP8266. После загрузки откройте Serial Monitor на скорости 115200 бод.

Если всё прошло как ожидалось, вы должны получить подобное сообщение в Serial Monitor.

ESP8266 NodeMCU отправка Email — сообщение успешно отправлено Serial Monitor

Проверьте вашу учётную запись электронной почты. Вы должны получить письмо от вашей платы ESP8266.

Письмо получено от платы ESP8266 аккаунт Gmail

Если вы выбрали опцию отправки сообщения с HTML-текстом, вот как выглядит сообщение:

ESP8266 SMTP-сервер отправка Email с телом в формате HTML

Если вы включили обычное текстовое сообщение, вот письмо, которое вы должны получить.

ESP8266 SMTP-сервер отправка Email с телом в формате обычного текста

Отправка вложений по Email с ESP8266 (Arduino IDE)

В этом разделе мы покажем вам, как отправлять вложения в электронных письмах, отправляемых ESP8266. Мы покажем, как отправлять файлы .txt или изображения. Это может быть полезно для отправки файла .txt с показаниями датчиков за последние несколько часов или для других приложений.

Вы должны сохранить файлы, которые хотите отправить, в файловой системе ESP8266 (SPIFFS или LittleFS). Файловая система по умолчанию, используемая библиотекой, — LittleFS. Вы также можете отправлять вложения, сохранённые на карте microSD, но в этом руководстве мы не будем рассматривать эту тему.

Загрузка файлов в LittleFS

Чтобы отправлять файлы по электронной почте, вы должны сохранить их в файловой системе ESP8266. Библиотека по умолчанию использует LittleFS. Для загрузки файлов в LittleFS с помощью Arduino IDE вам нужно установить плагин Filesystem Uploader. Прочитайте следующее руководство, чтобы узнать, как установить и загрузить файлы в файловую систему ESP8266:

Если вы используете VS Code + PlatformIO, следуйте следующему руководству, чтобы узнать, как загрузить файлы в LittleFS:

Создайте новый скетч Arduino и сохраните его. Перейдите в Sketch > Show Sketch folder. Внутри папки скетча Arduino создайте папку с именем data. Переместите файл .png и файл .txt в вашу папку data.

Или вы можете нажать здесь, чтобы скачать папку проекта.

Примечание: при использовании кода по умолчанию ваши файлы должны называться image.png и text_file.txt, или вы можете изменить код для импорта файлов с другим именем.

Мы будем отправлять эти файлы:

Загрузка файлов в файловую систему для отправки как вложение электронной почты

Структура вашей папки должна выглядеть следующим образом (скачать папку проекта):

Отправка email с вложениями — структура папки файловой системы

После перемещения файлов в папку data вы можете загрузить их на плату с помощью Arduino IDE. Нажмите [Ctrl] + [Shift] + [P], чтобы открыть палитру команд, и нажмите на „Upload Little FS to Pico/ESP8266/ESP32“.

Примечание: Если у вас нет этой опции, значит вы не установили плагин LittleFS Uploader. Обязательно следуйте этому руководству для его установки: Arduino IDE 2: установка загрузчика ESP8266 NodeMCU LittleFS (загрузка файлов в файловую систему).

Загрузка LittleFS в Pico/ESP8266/ESP32

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

Через несколько секунд вы должны получить сообщение «Completed upload.» (Загрузка завершена). Файлы были успешно загружены в файловую систему ESP8266.

Загрузка LittleFS завершена ESP8266 Arduino IDE

Код

Следующий код отправляет электронное письмо с файлом .txt и прикреплённым изображением. Перед загрузкой кода введите свои сетевые учётные данные, настройки email отправителя и email получателя.

/*
  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. Файловая система по умолчанию, установленная в библиотеке для ESP8266 — это 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);

Если вы хотите отправить больше вложений, вам нужно вызвать следующую строку перед добавлением следующего вложения:

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 бод. Если всё прошло как ожидалось, вы должны получить подобное сообщение в Serial Monitor.

ESP8266 отправка email с вложениями успешно — Serial Monitor

Если вы зайдёте в свой почтовый ящик, вы должны получить сообщение с двумя вложениями:

Отправка Email с вложениями ESP8266 NodeMCU аккаунт Gmail Arduino IDE

Заключение

В этом руководстве вы узнали, как отправлять электронные письма с платой ESP8266 NodeMCU с использованием SMTP-сервера. Вы научились отправлять HTML-текст, обычный текст и вложения.

Теперь идея состоит в том, чтобы модифицировать код и включить его в свои проекты. Например, это может быть полезно для отправки файла .txt с показаниями датчиков за последний час, уведомлений при обнаружении движения и многого другого.

Надеемся, вы нашли это руководство интересным. У нас есть аналогичное руководство для ESP32:

Узнайте больше об ESP8266 с нашими ресурсами:

Спасибо за чтение.