ESP32/ESP8266: Отправка Email-уведомлений с помощью PHP-скрипта
В этом проекте вы создадите клиент на ESP32 или ESP8266, который выполняет HTTP POST запрос к PHP-скрипту для отправки email-уведомления с показаниями датчиков.
Вы также можете установить пороговое значение, чтобы email-уведомление отправлялось только тогда, когда температура/влажность/давление превышает определённое значение.
В качестве примера мы будем использовать датчик BME280, подключённый к плате ESP32 или ESP8266. Вы можете модифицировать предоставленный код для отправки показаний с другого датчика или даже использовать несколько плат.
Это отличный способ отправлять email-уведомления с ESP32 или ESP8266 без использования IFTTT или SMTP-сервера.
Для создания этого проекта вам необходимо:
Этот проект также является отличным дополнением к нашим предыдущим проектам:
1. Размещение вашего PHP-приложения
Цель этого проекта – иметь собственное доменное имя и хостинг-аккаунт, который позволяет отправлять email-уведомления (без использования SMTP-сервера, IFTTT и т.д.).
Вот общий обзор того, как работает проект:
Я рекомендую использовать один из следующих хостинг-сервисов, которые могут удовлетворить все требования проекта:
Bluehost (удобный интерфейс с cPanel): бесплатное доменное имя при оформлении 3-летнего плана. Я рекомендую выбирать вариант с неограниченным количеством сайтов;
Digital Ocean: Linux-сервер, которым вы управляете через командную строку. Я рекомендую этот вариант только для продвинутых пользователей.
Эти два сервиса – те, которые я использую и лично рекомендую, но вы можете использовать любой другой хостинг-сервис. Любой хостинг, предлагающий PHP и MySQL, будет работать с этим руководством. Если у вас нет хостинг-аккаунта, я рекомендую зарегистрироваться на Bluehost.
Получить хостинг и доменное имя на Bluehost »
При покупке хостинг-аккаунта вам также потребуется приобрести доменное имя.
Примечание
Вы также можете запустить LAMP (Linux, Apache, MySQL, PHP) сервер на Raspberry Pi, но он не может самостоятельно отправлять электронные письма. Для отправки email с Raspberry Pi через PHP вам потребуется использовать SMTP (Simple Mail Transfer Protocol) сервер.
2. PHP-скрипт HTTP – Отправка Email-уведомления
После регистрации хостинг-аккаунта и настройки доменного имени вы можете войти в свою cPanel или аналогичную панель управления.
После этого выполните следующие шаги для создания PHP-скрипта, который отвечает за приём входящих запросов от ESP32/ESP8266 и отправку email.
Если вы используете хостинг-провайдера с cPanel, перейдите в раздел Advanced и найдите «File Manager»:
Затем выберите опцию public_html и нажмите кнопку «+ File» для создания нового файла .php.
Примечание
Если вы следуете этому руководству и не знакомы с PHP, я рекомендую создать файл с точно таким же именем. В противном случае вам потребуется изменить скетч ESP с указанием другого URL-пути.
Создайте новый файл в /public_html с точно таким именем и расширением: email-notification.php
Отредактируйте только что созданный файл (email-notification.php) и скопируйте следующий скрипт:
<?php
/*
Rui Santos
Complete project details at https://RandomNerdTutorials.com/esp32-esp8266-send-email-notification/
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.
*/
// Receiver Email Address (where to send email notification)
$email_address = "YourEmailAddress@example.com";
// Keep this API Key value to be compatible with the ESP code provided in the project page. If you change this value, the ESP sketch needs to match
$api_key_value = "tPmAT5Ab3j7F9";
$api_key = $value1 = $value2 = $value3 = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$api_key = test_input($_POST["api_key"]);
if($api_key == $api_key_value) {
$value1 = test_input($_POST["value1"]);
$value2 = test_input($_POST["value2"]);
$value3 = test_input($_POST["value3"]);
// Email message
$email_msg = "Temperature: " . $value1 . "ºC\nHumidity: " . $value2 . "%\nPressure: " . $value3 . "hPa";
// Use wordwrap() if lines are longer than 70 characters
$email_msg = wordwrap($email_msg, 70);
// Uncomment the next if statement to set a threshold
// ($value1 = temperature, $value2 = humidity, $value3 = pressure)
/*if($value1 < 24.0){
echo "Temperature below threshold, don't send email";
exit;
}*/
// send email with mail(receiver email address, email subject, email message)
mail($email_address, "[NEW] ESP BME280 Readings", $email_msg);
echo "Email sent";
}
else {
echo "Wrong API Key provided.";
}
}
else {
echo "No data posted with HTTP POST.";
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
Перед сохранением файла вам необходимо изменить переменную $email_address, указав адрес электронной почты получателя:
// Receiver Email Address (where to send email notification)
$email_address = "YourEmailAddress@example.com";
После добавления адреса электронной почты получателя сохраните файл и продолжите работу с этим руководством. Если вы попробуете перейти по следующему URL-адресу вашего домена, вы увидите следующее:
https://example.com/email-notification.php
Если вы видите это сообщение, значит всё настроено правильно. Вы можете продолжить работу с этим проектом.
3. Настройка ESP32 или ESP8266
Этот проект совместим как с платами ESP32, так и с ESP8266. Вам нужно лишь собрать простую схему и загрузить предоставленный скетч для публикации показаний температуры, влажности и давления на ваш PHP-скрипт, который затем будет отвечать за отправку email-уведомлений. Скетч немного отличается для каждой платы.
Необходимые компоненты
Для этого примера мы будем получать показания датчика BME280. Вот список компонентов, необходимых для сборки схемы этого проекта:
Плата ESP32 (смотрите Лучшие платы ESP32)
Альтернатива – плата ESP8266 (смотрите Лучшие платы ESP8266)
Схемы подключения
Модуль датчика BME280, который мы используем, связывается по протоколу I2C, поэтому вам нужно подключить его к выводам I2C ESP32 или ESP8266.
Подключение BME280 к ESP32
BME280 |
ESP32 |
|---|---|
SCK (вывод SCL) |
GPIO 22 |
SDI (вывод SDA) |
GPIO 21 |
Соберите схему, как показано на следующей схеме подключения (прочитайте полное руководство ESP32 с BME280).
Рекомендуемое чтение: Справочное руководство по выводам ESP32
Подключение BME280 к ESP8266
BME280 |
ESP8266 |
|---|---|
SCK (вывод SCL) |
GPIO 5 |
SDI (вывод SDA) |
GPIO 4 |
Соберите схему, как показано на следующей схеме подключения, если вы используете плату ESP8266 (прочитайте полное руководство ESP8266 с BME280).
Рекомендуемое чтение: Справочное руководство по выводам ESP8266
Установка библиотек
Мы будем программировать ESP32/ESP8266 с помощью Arduino IDE, поэтому у вас должно быть установлено дополнение ESP32/ESP8266 в вашей Arduino IDE. Следуйте одному из следующих руководств в зависимости от используемой платы:
Установка платы ESP32 в Arduino IDE – вам также нужно установить библиотеку BME280 и библиотеку Adafruit_Sensor
Установка платы ESP8266 в Arduino IDE – вам также нужно установить библиотеку BME280 и библиотеку Adafruit_Sensor
Код для ESP32
Следуйте этому разделу, если вы используете ESP32. Для ESP8266 нажмите здесь.
После установки необходимых дополнений скопируйте следующий код в вашу Arduino IDE, но пока не загружайте его. Вам нужно внести некоторые изменения, чтобы он работал для вас.
/*
Rui Santos
Complete project details at https://RandomNerdTutorials.com/esp32-esp8266-send-email-notification/
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 <WiFi.h>
#include <WiFiClientSecure.h>
#include <HTTPClient.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
// REPLACE with your Domain name and URL path or IP address with path
const char* serverName = "https://example.com/email-notification.php";
// Keep this API Key value to be compatible with the PHP code provided in the project page.
// If you change the apiKeyValue value, the PHP file /email-notification.php also needs to have the same key
String apiKeyValue = "tPmAT5Ab3j7F9";
/*#include <SPI.h>
#define BME_SCK 18
#define BME_MISO 19
#define BME_MOSI 23
#define BME_CS 5*/
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme; // I2C
//Adafruit_BME280 bme(BME_CS); // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.println("Connecting");
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());
// (you can also pass in a Wire library object like &Wire2)
bool status = bme.begin(0x76);
if (!status) {
Serial.println("Could not find a valid BME280 sensor, check wiring or change I2C address!");
while (1);
}
//Check WiFi connection status
if(WiFi.status()== WL_CONNECTED){
WiFiClientSecure *client = new WiFiClientSecure;
client->setInsecure(); //don't use SSL certificate
HTTPClient https;
// Your Domain name with URL path or IP address with path
https.begin(*client, serverName);
// Specify content-type header
https.addHeader("Content-Type", "application/x-www-form-urlencoded");
// Prepare your HTTP POST request data
String httpRequestData = "api_key=" + apiKeyValue + "&value1=" + String(bme.readTemperature())
+ "&value2=" + String(bme.readHumidity()) + "&value3=" + String(bme.readPressure()/100.0F) + "";
Serial.print("httpRequestData: ");
Serial.println(httpRequestData);
// You can comment the httpRequestData variable above
// then, use the httpRequestData variable below (for testing purposes without the BME280 sensor)
//String httpRequestData = "api_key=tPmAT5Ab3j7F9&sensor=BME280&location=Office&value1=24.75&value2=49.54&value3=1005.14";
// Send HTTP POST request
int httpResponseCode = https.POST(httpRequestData);
// If you need an HTTP request with a content type: text/plain
//https.addHeader("Content-Type", "text/plain");
//int httpResponseCode = https.POST("Hello, World!");
// If you need an HTTP request with a content type: application/json, use the following:
//https.addHeader("Content-Type", "application/json");
//int httpResponseCode = https.POST("{\"value1\":\"19\",\"value2\":\"67\",\"value3\":\"78\"}");
if (httpResponseCode>0) {
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
}
else {
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
// Free resources
https.end();
}
else {
Serial.println("WiFi Disconnected");
}
// Use deep sleep to make the ESP send an email every X number of minutes/hours with low power consumption
// ESP32 Deep Sleep Guide: https://RandomNerdTutorials.com/esp32-deep-sleep-arduino-ide-wake-up-sources/
}
void loop() {
}
Настройка сетевых учётных данных
Вам необходимо изменить следующие строки, указав ваши сетевые учётные данные: SSID и пароль. В коде есть комментарии, указывающие, где нужно внести изменения.
// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
Настройка serverName
Вам также нужно указать ваше доменное имя, чтобы ESP публиковал показания на ваш собственный сервер.
const char* serverName = "https://example.com/email-notification.php";
Теперь вы можете загрузить код на вашу плату.
Примечание
Большинство серверов требуют выполнения HTTPS-запросов. Код выше выполняет HTTPS-запросы для соответствия требованиям большинства современных облачных серверов.
Ваш сервер не поддерживает HTTPS? Используйте этот код вместо этого.
Как работает код
Вот краткое описание того, как работает код:
Импортируются все библиотеки для работы (импортируются либо библиотеки ESP32, либо ESP8266 в зависимости от выбранной платы в Arduino IDE);
Устанавливаются переменные, которые вы можете изменить (apiKeyValue);
apiKeyValue – это просто случайная строка, которую вы можете модифицировать. Она используется в целях безопасности, чтобы только тот, кто знает ваш API-ключ, мог отправлять email-уведомления.
Инициализируется последовательная связь для отладки;
Устанавливается Wi-Fi соединение с вашим маршрутизатором;
Инициализируется датчик BME280 для получения показаний температуры, влажности и давления;
Инициализируется защищённый WiFi-клиент.
Затем в оставшейся части setup() выполняется HTTP POST запрос с последними показаниями BME280:
// Your Domain name with URL path or IP address with path
http.begin(client, serverName);
// Specify content-type header
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
// Prepare your HTTP POST request data
String httpRequestData = "api_key=" + apiKeyValue + "&value1=" + String(bme.readTemperature())
+ "&value2=" + String(bme.readHumidity()) + "&value3=" + String(bme.readPressure()/100.0F) + "";
int httpResponseCode = http.POST(httpRequestData);
Вы можете закомментировать переменную httpRequestData выше, которая объединяет все показания BME280, и использовать переменную httpRequestData ниже для тестирования:
String httpRequestData = "api_key=tPmAT5Ab3j7F9&value1=24.75&value2=49.54&value3=1005.14";
Узнайте больше о HTTPS-запросах с ESP32: ESP32 HTTPS Requests (Arduino IDE).
Код для ESP8266
Следуйте этому разделу, если вы используете ESP8266. Для ESP32 смотрите раздел выше.
После установки необходимых дополнений скопируйте следующий код в вашу Arduino IDE, но пока не загружайте его. Вам нужно внести некоторые изменения, чтобы он работал для вас.
/*
Rui Santos
Complete project details at https://RandomNerdTutorials.com/esp32-esp8266-send-email-notification/
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 <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecureBearSSL.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
// REPLACE with your Domain name and URL path or IP address with path
const char* serverName = "https://example.com/email-notification.php";
// Keep this API Key value to be compatible with the PHP code provided in the project page.
// If you change the apiKeyValue value, the PHP file /email-notification.php also needs to have the same key
String apiKeyValue = "tPmAT5Ab3j7F9";
/*#include <SPI.h>
#define BME_SCK 18
#define BME_MISO 19
#define BME_MOSI 23
#define BME_CS 5*/
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme; // I2C
//Adafruit_BME280 bme(BME_CS); // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.println("Connecting");
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());
// (you can also pass in a Wire library object like &Wire2)
bool status = bme.begin(0x76);
if (!status) {
Serial.println("Could not find a valid BME280 sensor, check wiring or change I2C address!");
while (1);
}
//Check WiFi connection status
if(WiFi.status()== WL_CONNECTED){
std::unique_ptr<BearSSL::WiFiClientSecure>client(new BearSSL::WiFiClientSecure);
// Ignore SSL certificate validation
client->setInsecure();
//create an HTTPClient instance
HTTPClient https;
// Your Domain name with URL path or IP address with path
https.begin(*client, serverName);
// Specify content-type header
https.addHeader("Content-Type", "application/x-www-form-urlencoded");
// Prepare your HTTP POST request data
String httpRequestData = "api_key=" + apiKeyValue + "&value1=" + String(bme.readTemperature())
+ "&value2=" + String(bme.readHumidity()) + "&value3=" + String(bme.readPressure()/100.0F) + "";
Serial.print("httpRequestData: ");
Serial.println(httpRequestData);
// You can comment the httpRequestData variable above
// then, use the httpRequestData variable below (for testing purposes without the BME280 sensor)
//String httpRequestData = "api_key=tPmAT5Ab3j7F9&sensor=BME280&location=Office&value1=24.75&value2=49.54&value3=1005.14";
// Send HTTP POST request
int httpResponseCode = https.POST(httpRequestData);
// If you need an HTTP request with a content type: text/plain
//http.addHeader("Content-Type", "text/plain");
//int httpResponseCode = https.POST("Hello, World!");
// If you need an HTTP request with a content type: application/json, use the following:
//http.addHeader("Content-Type", "application/json");
//int httpResponseCode = https.POST("{\"value1\":\"19\",\"value2\":\"67\",\"value3\":\"78\"}");
if (httpResponseCode>0) {
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
}
else {
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
// Free resources
https.end();
}
else {
Serial.println("WiFi Disconnected");
}
// Use deep sleep to make the ESP send an email every X number of minutes/hours with low power consumption
// ESP8266 Deep Sleep Guide: https://RandomNerdTutorials.com/esp8266-deep-sleep-with-arduino-ide/
}
void loop() {
}
Настройка сетевых учётных данных (ESP8266)
Вам необходимо изменить следующие строки, указав ваши сетевые учётные данные: SSID и пароль. В коде есть комментарии, указывающие, где нужно внести изменения.
// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
Настройка serverName (ESP8266)
Вам также нужно указать ваше доменное имя, чтобы ESP публиковал показания на ваш собственный сервер.
const char* serverName = "https://example.com/email-notification.php";
Теперь вы можете загрузить код на вашу плату.
Примечание
Большинство серверов требуют выполнения HTTPS-запросов. Код выше выполняет HTTPS-запросы для соответствия требованиям большинства современных облачных серверов.
Ваш сервер не поддерживает HTTPS? Используйте этот код вместо этого.
Узнайте больше о HTTPS-запросах с ESP8266: ESP8266 NodeMCU HTTPS Requests (Arduino IDE).
Демонстрация
После выполнения всех шагов подайте питание на плату ESP и дайте ей выполнить HTTP-запрос к вашему серверу:
Если всё работает правильно, вот что вы должны увидеть в мониторе последовательного порта Arduino IDE:
Откройте вашу почту, у вас должно быть новое письмо с темой «[NEW] ESP BME280 Readings» с последними показаниями температуры:
Чтобы отправить новое письмо, нажмите встроенную кнопку RESET/ENABLE на ESP для перезапуска, и новые показания будут отправлены по электронной почте.
Для финального приложения я рекомендую использовать глубокий сон (deep sleep), чтобы ESP отправлял email каждые X минут/часов с низким энергопотреблением. Прочитайте одно из этих руководств, чтобы добавить глубокий сон в ваш скетч:
Включение порогового уведомления
Наконец, имейте в виду, что каждый раз, когда вы перезапускаете ESP (или ESP просыпается из глубокого сна), он будет отправлять новое email-уведомление с текущими значениями. Может быть полезно установить пороговое значение, чтобы вы получали email-уведомление только тогда, когда ваши показания выше или ниже порогового значения.
В вашем PHP-скрипте (email-notification.php) раскомментируйте следующий оператор if:
// Uncomment the next if statement to set a threshold
// ($value1 = temperature, $value2 = humidity, $value3 = pressure)
/*if($value1 < 24.0){
echo "Temperature below threshold, don't send email";
exit;
}*/
Он будет выглядеть так:
// Uncomment the next if statement to set a threshold
// ($value1 = temperature, $value2 = humidity, $value3 = pressure)
if($value1 < 24.0){
echo "Temperature below threshold, don't send email";
exit;
}
Вы можете изменить этот оператор if с нужным пороговым значением и отправлять email только на основе этого условия. С текущим кодом email-уведомление будет отправлено только тогда, когда температура превысит 24.0 градуса Цельсия.
Заключение
В этом руководстве вы узнали, как отправлять электронные письма с ESP32 и ESP8266, используя собственный сервер и доменное имя.
Предоставленный пример максимально прост, чтобы вы могли понять, как всё работает. После понимания этого примера вы можете изменить содержимое письма, публиковать показания других датчиков, использовать несколько плат ESP и многое другое.
Вам также может понравиться:
Узнайте больше об ESP32 с нашими ресурсами:
Примечание
Источник: ESP32/ESP8266 Send Email Notification using PHP Script – RandomNerdTutorials.com