samedi 30 janvier 2021

Envoi d'un email par l'ESP32

Dans certaines situations, il peut être intéressant de programmer un ESP32 pour qu'il envoie un email. Il pourrait s'agir, par exemple, d'un rapport quotidien vous indiquant les valeurs mesurées par ses capteurs, ou encore d'une alerte vous avisant qu'un événement inhabituel a été détecté.


Obtenir les paramètres du serveur SMTP utilisé

Pour l'envoi du email, l'ESP32 enverra des instructions à un serveur SMTP (Simple Mail Transfer Protocol). Pour ce faire, vous pouvez utiliser un compte email sur Gmail, sur outlook.com, etc. Pour programmer l'ESP32, vous aurez besoin de connaître l'adresse du serveur SMTP associé à votre compte email, ainsi que le numéro de son port.

Pour ma part, j'ai utilisé un compte outlook.com. En allant dans les paramètres (par l'entremise de la roue d'engrenage en haut à droite, puis en cliquant sur "Afficher tous les paramètres d'Outlook",j'ai accédé à la section "Courrier", puis "Synchroniser le courriel". À cet endroit, on m'informe que mon serveur SMTP est smtp.office365.com, et que le port est 587. Ces informations peuvent évidemment être différentes pour le compte email que vous aller choisir d'utiliser.


Installation de la bibliothèque

Par l'entremise du gestionnaire de bibliothèques de l'IDE Arduino, j'ai installé la bibliothèque ESP Mail Client par Mobizt.


En principe, cette bibliothèque fonctionne également avec l'ESP8266 (pourvu que le core ESP8266 soit de la version 2.6.3 ou plus récente). Malheureusement, je me suis buté à une erreur de compilation à chacune de mes tentatives de l'utiliser avec l'ESP8266.

Exemple de sketch

J'ai fait le sketch ci-dessous en utilisant, comme point de départ, l'exemple "Send_Text" fourni par l'auteur de la bibliothèque. Dans son exemple, l'auteur fait la démonstration d'à peu près tous les paramètres qui peuvent être modifiés. De mon côté, j'ai plutôt opté pour un sketch aussi bref que possible qui utilise généralement les valeurs par défaut, sans les modifier.

Dans ce sketch, je simule l'envoi de la mesure d'un capteur en générant un nombre aléatoire. Ainsi, vous pouvez facilement faire l'essai du programme sans qu'il soit nécessaire de brancher un véritable capteur à l'ESP32.

La fonction send_email() n'est exécutée qu'une seule fois, au démarrage du programme. Bien entendu, selon vos besoins, vous pouvez l'exécuter de façon périodique, ou lorsqu'un événement spécifique est détecté par un capteur.

Il va sans dire que, pour que le programme fonctionne, vous devez y écrire le nom et le mot de passe de votre réseau wifi, le login et le mot de passe de votre compte email, l'adresse email du destinataire, etc. (lignes 15 à 29).

-

/************************************************************************
Envoi d'un email par l'ESP32
Utilise la bibliothèque ESP Mail Client par Mobizt:
https://github.com/mobizt/ESP-Mail-Client
Pour plus d'informations:
https://electroniqueamateur.blogspot.com/2021/01/envoi-dun-email-par-lesp32.html
*************************************************************************/
#include <WiFi.h>
#include <ESP_Mail_Client.h>
// identfication du réseau wifi local
#define WIFI_SSID "nom du reseau wifi"
#define WIFI_PASSWORD "mot de passe wifi"
// identification du compte email utilisé pour l'envoi
#define SMTP_HOST "adresse du serveur smtp"
#define SMTP_PORT 587 //assurez vous d'utiliser le bon numéro de port
#define AUTHOR_EMAIL "adresse email de l'expediteur"
#define AUTHOR_PASSWORD "mot de passe du compte email utilise pour l'expedition"
// identification du destinataire
#define RECIPIENT_NAME "nom du destinataire"
#define RECIPIENT_EMAIL "adresse email du destinataire"
#define EMAIL_TITLE "Titre du email"
SMTPSession smtp;
void setup()
{
// connexion au réseau Wifi et affichage dans le moniteur série
Serial.begin(115200);
Serial.println();
Serial.print("Connexion au reseau Wifi.");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(200);
}
Serial.println("reussie");
Serial.println();
smtp.callback(smtpCallback); // permettra de suivre le déroulement sur le moniteur série
send_email(); // routine qui envoie le email
}
void loop()
{
// dans cet exemple, le email est envoyé une seule fois, au démarrage du programme
}
void send_email()
{
ESP_Mail_Session session;
char contenu_message[100]; // ici ajusté à 100 caractères maximum
SMTP_Message message;
session.server.host_name = SMTP_HOST;
session.server.port = SMTP_PORT;
session.login.email = AUTHOR_EMAIL;
session.login.password = AUTHOR_PASSWORD;
message.sender.name = "ESP32";
message.sender.email = AUTHOR_EMAIL;
message.subject = EMAIL_TITLE;
message.addRecipient(RECIPIENT_NAME, RECIPIENT_EMAIL);
// construction du corps du message (inclusion d'un nombre aléatoire)
sprintf(contenu_message, "Temperature mesuree: %.2f °C", random(10000)/100.0);
message.text.content = contenu_message;
message.priority = esp_mail_smtp_priority::esp_mail_smtp_priority_normal;
if (!smtp.connect(&session)) // connexion au serveur SMTP
return;
if (!MailClient.sendMail(&smtp, &message)) // envoi du email
Serial.println("Erreur lors de l'envoi du email, " + smtp.errorReason());
}
// Affichage d'infos dans le moniteur série pendant l'envoi du email
void smtpCallback(SMTP_Status status)
{
Serial.println(status.info());
}

-

Grâce à la fonction smtpCallback, à la fin du sketch, on peut suivre sur le moniteur série le processus d'expédition du email.


L'email a bel et bien été envoyé...et reçu!

À lire également

Ce blog comporte plusieurs autres projets impliquant l'ESP32, notamment l'écriture de données dans un document Google Sheets ou Google Docs.

Yves Pelletier (TwitterFacebook

2 commentaires:

  1. Tout bonnement GENIAL, juste ce que je cherchais merci de cette aide bienvenue.

    RépondreSupprimer
  2. Super pratique à utiliser sans compter, merci

    RépondreSupprimer