Après bien des déboires (comme exposé ici ) ,j'avance bien sur mon projet basé sur un MKR WiFI 1010, mais je bute sur une application qui m'apporterait pourtant plus de confort dans mon installation :
J'avais prévu au départ d'aller chercher régulièrement via mon serveur Web une string contenant le rapport journalier de consommation.
Je me suis dit qu'après tout un envoi automatique de mail avec ce rapport quotidien serait bien plus commode.
J'ai donc essayé avec succès la librairie WiFi.h qui fonctionne aussi bien avec l'ESP32 (même embarqué sur le MKR) qu'avec l'ESP8266.
Par contre ça ne fonctionne pas avec WiFiNINA que je dois utiliser par ailleurs dans mon projet car elle utilise le SSL
Je viens d'essayer avec la seule librairie connue qui est sensée traiter cela et que l'on trouve ici . Mais elle est extrêmement complexe pour mes faibles compétences et échoue à la connexion au Smtp de Gmail, pourtant après exécution des préparatifs du tutoriel (double facteur, mot de passage app Gmail à 16 caractères, etc...)
Quelqu'un aurait t'il une idée, soit en m'expliquant les subtilités de la librairie WiFiNINA en send mail, soit en contournant le SSL par le TLS, soit en passant par un autre serveur de mail, toute solution est envisageable.
Vos lumières seraient les bienvenues ...
Merci d'avance !
pas ou très peu d'utilisateurs de cette librairie sur ce forum, ici nous utilisons en général l'ESP32 'en solo' et non en 'coprocesseur WiFi" (pas de pb dans ce contexte pour le SSL avec les librairies adaptées comme WiFIClientSecure......)
Voir aussi cet exemple en 'pur ESP32' (sans WiFININA) : https://randomnerdtutorials.com/esp32-send-email-smtp-server-arduino-ide/
Je viens de recevoir mes ESP32, et l'envoi de mail se passe très bien avec l'exemple de la bibliothèque.
Par contre, pour ne s'éxécuter qu'une seule fois, le sketch est écrit sur le Setup (Void Loop vide).
J'ai besoin de l'insérer dans un Sketch plus complet, avec déclenchement par des conditions extraites d'un dialogue série et insertion de valeurs numériques diverses.
Je dois donc l'éexcuter dans la Loop.
J'ai fait plusieurs tentatives de répartition pour n'exécuter que la composition et l'envoi du mail dans la Loop avec un switch/case pour interdire la miltraillette, l'amont restant dans le Setup.
Je ne parviens pas à faire tourner cette fonction...
Une (ou des) idée(s) ?
Autre sujet : je n'arrive pas à voir clair sur le mode d'alimentation du module (WROOM-32).
Jusqu'à présent je travaille en alimentation via le port USB, mais une fois mis au point, je devrai utiliser le 5V (certains parlent de "VIN", sur le mien (Adafruit) j'ai une pin "5V").
Question : le branchement simultané de la pin 5V et de l'USB (pour débug sur site ou modification) est-elle possible ?
Une double diode est elle intégrée ?
Merci pour vos lumières !
J'ai fait plusieurs tentatives de répartition pour n'exécuter que la composition et l'envoi du mail dans la Loop avec un switch/case pour interdire la miltraillette, l'amont restant dans le Setup.
Je ne parviens pas à faire tourner cette fonction...
Une (ou des) idée(s) ?
sans doute si tu fournis le code des tes tentatives
Question : le branchement simultané de la pin 5V et de l'USB (pour débug sur site ou modification) est-elle possible ?
Une double diode est elle intégrée ?
double diode ou autre solution ...peut être... à voir sur le schéma de la carte que tu as en mains.
l'ESP32 a beaucoup de succès et se retrouve au coeur d'un grande diversité de cartes !!
Il faut toujours fournir des informations détailles , ne pas rester dans le flou pour avor des réponses précises
PS : selon l'avolution du contenu du fil de discussion il faudra peut être retoucher le titre de son fil .....en particulier si WiFiNINA est abandonnée
l'ESP32 a beaucoup de succès et se retrouve au coeur d'un grande diversité de cartes
Ma carte est celle-ci : Esp32 nodemcu devkit C v4 marquée :
"AZ-Delivery ESP32-WROOM-32"
sans doute si tu fournis le code des tes tentatives
En fait j'ai bricolé sans trop (voire rien) comprendre le sketch exemple cité par lesept .
En gros j'imagine pouvoir laisser dans le Setup tout ce qui concerne la préparation des champs et données constants (pour moi) et écrire dans le Loop :
Le contenu texte du mail contenant des valeurs issues de variables du sketch.
La commande d'exécution de l'envoi du mail
Le souci est que je ne sais pas décrypter la bibliothèque pour comprendre à quelles lignes correspondent ces deux informations.
// Start sending Email and close the session
if (!MailClient.sendMail(&smtp, &message))
Serial.println("Error sending Email, " + smtp.errorReason());
Donc tu construis ton mail avant cette commande. Tout ce qui ne change pas d'un mail à un autre peut être mis dans le setup. C'est ce qui change que tu mets dans la loop.
As-tu déclaré la variable message quelque part ?
Ça doit ressembler à ça:
/* Declare the message class */
SMTP_Message message;
As-tu testé les exemples de la bibliothèque avant de l'intégrer dans ton code ? C'est plus prudent de la faire fonctionner une fois avec un exemple dont on sait qu'il fonctionne, avant de se lancer dans la programmation.
J'ai testé avec succès immédiat les exemples en version Send_Text et Send_HTML.
C'est plus prudent de la faire fonctionner une fois avec un exemple dont on sait qu'il fonctionne, avant de se lancer dans la programmation.
Tout à fait d'accord, et c'est ainsi que je procède. Pour avancer pas à pas, j'ai donc simplement essayé de modifier l'exemple Text pour sortir du Setup et inclure dans la Loop les lignes qui traitent :
l'élaboration de la String du contenu du message (les autres données restent constantes),
l'envoi du message (une seule fois)
Une fois cet exemple modifié, j'entreprendrai de l'inclure dans mon projet existant.
Bien sûr, en plus des lignes de l'exemple déplacées, j'ai ajouté de quoi éviter le bouclage à répétition, en l'occurrence l'interrogation d'une entrée du port Série via le moniteur (je n'ai pas raccordé d'entrée physique à mon ESP).
Le Loop cité au post précédent est donc celui créé comme expliqué ici.
Faut dire que bien que copieusement commentés, les exemples sont difficilement compréhensibles pour moi.
Ceci illustre le problème de ne fournir qu'un bout du code. C'est fréquent sur le forum car le posteur imagine savoir où se trouve l'erreur. Mais même si le compilateur indique une ligne, la source de l'erreur peur se trouver ailleurs.
Il vaut donc mieux fournir l'ensemble du code, sauf s'il est vraiment très long...
+1
on se retrouve avec des fils de discussion à rallonge où il faut tirer les vers du nez pour avoir l'ensemble des informations nécessaires pour une aide efficace
par ailleurs je n'ai pas l'impression que la notion de' portée de variable' ait un rapport avec l'éventuelle verbosité d'une librairie....
Je vous poste donc le code complet (donc l'exemple "Send_Text" avec 2 lignes du setup déplacées dans le Loop + anti-répétition :
#include <Arduino.h>
#if defined(ESP32)
#include <WiFi.h>
#elif defined(ESP8266)
#include <ESP8266WiFi.h>
#endif
#include <ESP_Mail_Client.h>
#define WIFI_SSID "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
#define WIFI_PASSWORD "xxxxxxxxxxxxxxxxxxxxxxx"
int header;
#define SMTP_HOST "smtp.gmail.com"
#define SMTP_PORT 465
#define AUTHOR_EMAIL "xxxxxxxx@gmail.com"
#define AUTHOR_PASSWORD "xxxxxxxxxxxxxxx"
SMTPSession smtp;
void smtpCallback(SMTP_Status status);
const char rootCACert[] PROGMEM = "-----BEGIN CERTIFICATE-----\n"
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n"
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n"
"-----END CERTIFICATE-----\n";
void setup()
{
Serial.begin(115200);
#if defined(ARDUINO_ARCH_SAMD)
while (!Serial)
;
Serial.println();
Serial.println("**** Custom built WiFiNINA firmware need to be installed.****\nTo install firmware, read the instruction here, https://github.com/mobizt/ESP-Mail-Client#install-custom-built-wifinina-firmware");
#endif
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();
smtp.debug(1);
smtp.callback(smtpCallback);
ESP_Mail_Session session;
/* Set the session config */
session.server.host_name = SMTP_HOST;
session.server.port = SMTP_PORT;
session.login.email = AUTHOR_EMAIL;
session.login.password = AUTHOR_PASSWORD;
session.login.user_domain = "mydomain.net";
/* Declare the message class */
SMTP_Message message;
/* Set the message headers */
message.sender.name = "ESP Mail";
message.sender.email = AUTHOR_EMAIL;
message.subject = "Test sending plain text Email";
message.addRecipient("Jackjean", "jackjean@vivaldi.net");
message.text.charSet = "utf-8";
message.text.transfer_encoding = Content_Transfer_Encoding::enc_7bit;
message.priority = esp_mail_smtp_priority::esp_mail_smtp_priority_low;
/* Set the custom message header */
message.addHeader("Message-ID: <abcde.fghij@gmail.com>");
/* Connect to server with the session config */
if (!smtp.connect(&session))
return;
ESP_MAIL_PRINTF("Free Heap: %d\n", MailClient.getFreeHeap());
}
void loop()
{ while (Serial.available() > 0) {
if (header == 5)
{int rr = Serial.parseInt();
if (Serial.read() == '\n') {
String textMsg = "This is simple plain text message";
message.text.content = textMsg.c_str();
if (!MailClient.sendMail(&smtp, &message))
Serial.println("Error sending Email, " + smtp.errorReason()); } } }
}
/* 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);
ESP_MAIL_PRINTF("Subject: %s\n", result.subject);
}
Serial.println("----------------\n");
}
}
Petite remarque en passant : après avoir écumé des dizaines de sites avec exemples smtp aucun code n'utilise le Loop, tout est écrit dans le Setup, voire en amont... Je trouve ça étrange car inutilisable en pratique.
... les pratiques sont diverses !!! il ne faut pas se borner à un usage particulier
Nous sommes également nombreux à mettre l'ESP en sommeil profond entre deux envois de données (SMS, mail, publication MQTT...
dans ce cas loop() est généralement vide vu la manière dont le réveil fonctionne sur les divers ESP
le setup()peut tout à fait comporter la prise en compte des capteurs + la formation du message à envoyer (SMS, mail, publication MQTT, envoi vers une base de donnée.......)
setup() contient tout ce qui n'est exécuté qu'une seule fois à la mise sous tension ou au reveil de deepsleep
On met ce qu'on veut dans setup() qui peut tout à fait se terminer par la mise en veille profonde de l'ESP une fois le message transmis. L'ESP se réveillant tout seul ultérieurement pour recommencer un cycle complet
Voilà une réponse qui m'aide : ayant toujours utilisé le setup uniquement à un rôle de configuration (sans traitement) j'ignorais qu'on pouvait faire précéder l'écriture du contenu par un traitement de données...
Ceci devrait résoudre mon problème. Me reste à présent à creuser le domaine de sommeil / réveil de l'ESP32 par la liaison série . Je pense pouvoir y parvenir