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.
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.
À 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.