ESP32/ESP8266 Envoyer une notification par e-mail à l’aide d’un script PHP

ESP32/ESP8266 Envoyer une notification par e-mail à l'aide d'un script PHP

Dans ce projet, vous allez créer un client ESP32 ou ESP8266 qui envoie une requête HTTP POST à ​​un script PHP pour envoyer une notification par e-mail avec les lectures des capteurs.

ESP32 ESP8266 Envoyer une notification par e-mail à l'aide d'un script PHP

Mis à jour le 27 mars 2023

Vous pouvez également définir une valeur seuil, de sorte que votre notification par e-mail ne soit envoyée que si la température/humidité/pression est supérieure à une certaine valeur.

À titre d’exemple, nous utiliserons un capteur BME280 connecté à une carte ESP32 ou ESP8266. Vous pouvez modifier le code fourni pour envoyer les lectures d’un capteur différent ou même utiliser plusieurs cartes.

C’est un excellent moyen d’envoyer des notifications par e-mail à l’aide de l’ESP32 ou de l’ESP8266 sans compter sur IFTTT ou un serveur SMTP.

Pour construire ce projet, vous allez :

  1. Héberger un serveur et configurer un nom de domaine
  2. Créer un script PHP pour envoyer des notifications par e-mail
  3. Programmer ESP32 ou ESP8266 avec Arduino IDE

Ce projet est également un excellent ajout pour s’appuyer sur nos projets précédents :

1. Hébergement de votre application PHP

Le but de ce projet est d’avoir votre propre nom de domaine et compte d’hébergement qui vous permet d’envoyer des notifications par email (sans utiliser de serveur SMTP, IFTTT, etc…).

Voici un aperçu de haut niveau du fonctionnement du projet :

Hébergement d'une application PHP pour envoyer un e-mail de lectures de capteurs ESP32 ou ESP8266 BME280

Je recommande d’utiliser l’un des services d’hébergement suivants qui peuvent gérer toutes les exigences du projet :

  • Bluehost (convivial avec cPanel) : nom de domaine gratuit lors de la souscription au plan de 3 ans. Je recommande de choisir l’option de sites Web illimités ;
  • Digital Ocean : serveur Linux que vous gérez via une ligne de commande. Je n’ai recommandé cette option qu’aux utilisateurs avancés.

Ces deux services sont ceux que j’utilise et que je recommande personnellement, mais vous pouvez utiliser n’importe quel autre service d’hébergement. Tout service d’hébergement proposant PHP et MySQL fonctionnera avec ce didacticiel. Si vous n’avez pas de compte d’hébergement, je vous recommande de vous inscrire à Bluehost.

Obtenez un hébergement et un nom de domaine avec Bluehost »

Lors de l’achat d’un compte d’hébergement, vous devrez également acheter un nom de domaine. Si vous aimez nos projets, vous pourriez envisager de vous inscrire à l’un des services d’hébergement recommandés, car vous soutiendrez notre travail.

Remarque : vous pouvez également exécuter un serveur LAMP (Linux, Apache, MySQL, PHP) sur un Raspberry Pi, mais il ne peut pas envoyer d’e-mails de manière autonome. Pour envoyer un email avec un Raspberry Pi en PHP, vous devez utiliser un serveur SMTP (Simple Mail Transfer Protocol).

2. PHP Script HTTP – Envoyer une notification par e-mail

Après avoir créé un compte d’hébergement et configuré un nom de domaine, vous pouvez vous connecter à votre cPanel ou à un tableau de bord similaire.

Après cela, suivez les étapes suivantes pour créer un script PHP chargé de recevoir les demandes entrantes de l’ESP32/ESP8266 et d’envoyer un e-mail.

Si vous utilisez un fournisseur d’hébergement avec cPanel, allez dans Avancé et recherchez « Gestionnaire de fichiers » :

ESP32 ESP8266 CPanel Ouvrir Créer Modifier les fichiers PHP

Ensuite, sélectionnez l’option public_html et appuyez sur le bouton « + Fichier » pour créer un nouveau fichier .php.

ESP32 ESP8266 CPanel Créer un nouveau fichier PHP

Remarque : si vous suivez ce didacticiel et que vous n’êtes pas familier avec PHP, je vous recommande de créer ce fichier exact. Sinon, vous devrez modifier l’esquisse ESP fournie avec un chemin d’URL différent.

Créez un nouveau fichier dans /public_html avec ce nom et cette extension exacts : email-notification.php

PHP Créer une notification par e-mail de nouveau fichier

Modifiez le fichier nouvellement créé (email-notification.php) et copiez le script suivant :

<?php

/*
  Rui Santos
  Complete project details at https://Raspberryme.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 = "[email protected]";

// 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;
}

Afficher le code brut

Avant d’enregistrer le fichier, vous devez modifier la variable $email_address avec l’adresse e-mail du destinataire :

// Receiver Email Address (where to send email notification)
$email_address = "[email protected]";

Après avoir ajouté l’e-mail du destinataire, enregistrez le fichier et continuez avec ce didacticiel. Si vous essayez d’accéder à votre nom de domaine dans le chemin d’URL suivant, vous verrez ce qui suit :

https://example.com/email-notification.php
ESP32 ESP8266 Tester l'URL PHP de notification par e-mail

Si vous voyez ce message, cela signifie que tout est configuré correctement. Vous pouvez poursuivre ce projet.

3. Configuration de votre ESP32 ou ESP8266

Ce projet est compatible avec les cartes ESP32 et ESP8266. Il vous suffit d’assembler un circuit simple et de télécharger le croquis fourni pour publier les relevés de température, d’humidité et de pression dans votre script PHP, qui sera ensuite chargé de gérer les notifications par e-mail. Le croquis est légèrement différent pour chaque planche.

Pièces requises

Pour cet exemple, nous obtiendrons les lectures du capteur du capteur BME280. Voici une liste des pièces dont vous avez besoin pour construire le circuit pour ce projet :

Vous pouvez utiliser les liens précédents ou accéder directement à MakerAdvisor.com/tools pour trouver toutes les pièces pour vos projets au meilleur prix !

1680762371 594 ESP32ESP8266 Envoyer une notification par e mail a laide dun script

Schémas

Le module de capteur BME280 que nous utilisons communique via le protocole de communication I2C, vous devez donc le connecter aux broches ESP32 ou ESP8266 I2C.

Câblage BME280 vers ESP32

BME280 ESP32
SCK (broche SCL) GPIO 22
SDI (broche SDA) GPIO 21

Alors, assemblez votre circuit comme indiqué dans le diagramme schématique suivant (lisez le Guide complet pour ESP32 avec BME280).

Câblage BME280 vers ESP32

Lecture recommandée : Guide de référence du brochage ESP32

Câblage BME280 vers ESP8266

BME280 ESP8266
SCK (broche SCL) GPIO 5
SDI (broche SDA) GPIO 4

Assemblez votre circuit comme dans le schéma suivant si vous utilisez une carte ESP8266 (lisez le Guide complet pour ESP8266 avec BME280).

Câblage BME280 vers ESP8266

Lecture recommandée : Guide de référence du brochage ESP8266

Installation des bibliothèques

Nous allons programmer l’ESP32/ESP8266 à l’aide de l’IDE Arduino, vous devez donc avoir le module complémentaire ESP32/ESP8266 installé dans votre IDE Arduino. Suivez l’un des tutoriels suivants en fonction de la carte que vous utilisez :

Code ESP32

Suivez cette section si vous utilisez un ESP32. Pour un ESP8266 cliquez ici.

Après avoir installé les modules complémentaires de carte nécessaires, copiez le code suivant dans votre IDE Arduino, mais ne le téléchargez pas encore. Vous devez apporter quelques modifications pour que cela fonctionne pour vous.

/*
  Rui Santos
  Complete project details at https://Raspberryme.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://Raspberryme.com/esp32-deep-sleep-arduino-ide-wake-up-sources/  
}

void loop() {
}

Afficher le code brut

Définition de vos identifiants réseau

Vous devez modifier les lignes suivantes avec vos identifiants réseau : SSID et mot de passe. Le code est bien commenté sur l’endroit où vous devez apporter les modifications.

// Replace with your network credentials
const char* ssid     = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

Définition de votre nom de serveur

Vous devez également saisir votre nom de domaine, afin que l’ESP publie les lectures sur votre propre serveur.

const char* serverName = "https://example.com/email-notification.php";

Maintenant, vous pouvez télécharger le code sur votre tableau.

Remarque : La plupart des serveurs nécessitent que vous fassiez des requêtes HTTPS. Le code ci-dessus rend les requêtes HTTPS conformes aux exigences de la plupart des serveurs cloud de nos jours.

Votre serveur ne supporte pas le HTTPS ? Utilisez plutôt ce code.

Comment fonctionne le code

Voici un bref résumé du fonctionnement du code :

  • Importez toutes les bibliothèques pour le faire fonctionner (il importera les bibliothèques ESP32 ou ESP8266 en fonction de la carte sélectionnée dans votre IDE Arduino);
  • Définissez les variables que vous voudrez peut-être modifier (apiKeyValue) ;
  • L’apiKeyValue est juste une chaîne aléatoire que vous pouvez modifier. Il est utilisé pour des raisons de sécurité, de sorte que seule toute personne connaissant votre clé API peut envoyer des notifications par e-mail.
  • Initialisez la communication série à des fins de débogage ;
  • Établissez une connexion Wi-Fi avec votre routeur ;
  • Initialisez le capteur BME280 pour obtenir des relevés de température, d’humidité et de pression ;
  • Initialisez un client WiFi sécurisé.

Ensuite, dans le reste de la configuration () est l’endroit où vous effectuez réellement le POST HTTP avec les dernières lectures 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);

Vous pouvez commenter la variable httpRequestData ci-dessus qui concatène toutes les lectures BME280 et utiliser la variable httpRequestData ci-dessous à des fins de test :

String httpRequestData = "api_key=tPmAT5Ab3j7F9&value1=24.75&value2=49.54&value3=1005.14";

En savoir plus sur les requêtes HTTPS avec l’ESP32 : requêtes HTTPS ESP32 (Arduino IDE).

Code ESP8266

Suivez cette section si vous utilisez un ESP8266. Pour un ESP32, consultez la section ci-dessus.

Après avoir installé les modules complémentaires de carte nécessaires, copiez le code suivant dans votre IDE Arduino, mais ne le téléchargez pas encore. Vous devez apporter quelques modifications pour que cela fonctionne pour vous.

/*
  Rui Santos
  Complete project details at https://Raspberryme.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://Raspberryme.com/esp8266-deep-sleep-with-arduino-ide/
}

void loop() {

}

Afficher le code brut

Définition de vos identifiants réseau

Vous devez modifier les lignes suivantes avec vos identifiants réseau : SSID et mot de passe. Le code est bien commenté sur l’endroit où vous devez apporter les modifications.

// Replace with your network credentials
const char* ssid     = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

Définition de votre nom de serveur

Vous devez également saisir votre nom de domaine, afin que l’ESP publie les lectures sur votre propre serveur.

const char* serverName = "https://example.com/email-notification.php";

Maintenant, vous pouvez télécharger le code sur votre tableau.

Remarque : La plupart des serveurs nécessitent que vous fassiez des requêtes HTTPS. Le code ci-dessus rend les requêtes HTTPS conformes aux exigences de la plupart des serveurs cloud de nos jours.

Votre serveur ne supporte pas le HTTPS ? Utilisez plutôt ce code.

En savoir plus sur les requêtes HTTPS avec l’ESP8266 : ESP8266 NodeMCU HTTPS Requests (Arduino IDE).

Manifestation

Après avoir terminé toutes les étapes, allumez votre carte ESP et laissez-la faire une requête HTTP à votre serveur :

ESP32 BME280 Arduino IDE MySQL

Si tout fonctionne correctement, voici ce que vous devriez voir dans votre moniteur série Arduino IDE :

ESP32 ESP8266 Envoyer un e-mail Arduino IDE Serial Monitor

Ouvrez votre client de messagerie, vous devriez avoir un nouveau mail avec pour objet «[NEW] Lectures ESP BME280 » avec les dernières lectures de température :

ESP32 ESP8266 Envoyer une notification par e-mail en utilisant PHP température humidité pression

Pour envoyer un nouvel e-mail, appuyez sur le bouton ESP intégré RESET/ENABLE pour le redémarrer et de nouvelles lectures seront envoyées par e-mail.

Pour une application finale, je recommande d’utiliser la veille profonde pour que l’ESP envoie un e-mail toutes les X minutes/heures avec une faible consommation d’énergie. Lisez l’un de ces guides pour ajouter un sommeil profond à votre croquis :

Activer la notification de seuil

Enfin, gardez à l’esprit que chaque fois que vous redémarrez votre ESP (ou que l’ESP sort d’un sommeil profond), il enverra une nouvelle notification par e-mail avec les valeurs actuelles. Il peut être utile de définir une valeur de seuil afin que vous ne receviez une notification par e-mail que lorsque vos relevés sont supérieurs ou inférieurs au seuil.

Dans votre script PHP (email-notification.php), décommentez l’instruction if suivante :

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

Il ressemblera à ceci:

// 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;
}

Vous pouvez modifier cette instruction if avec le seuil de valeur et envoyer uniquement un e-mail en fonction de cette condition. Avec le code actuel, il n’enverra une notification par e-mail que lorsque la température est supérieure à 24,0 °C.

Conclusion

Dans ce tutoriel, vous avez appris à envoyer des e-mails avec l’ESP32 et l’ESP8266 en utilisant votre propre serveur et nom de domaine.

L’exemple fourni est le plus simple possible afin que vous puissiez comprendre comment tout fonctionne. Après avoir compris cet exemple, vous pouvez modifier le contenu de l’e-mail, publier différentes lectures de capteurs, utiliser plusieurs cartes ESP, et bien plus encore.

Vous aimerez peut-être aussi lire :

En savoir plus sur l’ESP32 avec nos ressources :

Merci pour la lecture.

Cette vidéo vous emmène dans l’histoire de Raspberry Pi :

YouTube video