Probleme avec l'envoi de mail

Bonjour j'ai besoin d'aide.
je rencontre un problème d’envoi de mail. Si je lance le sketch tout va bien le mail passe correctement `mais j'ai programmé un envoie quelques heures plus tard et la j'ai une erreur
<Connection error, Status Code: 220, Error Code: -402, Reason: fail to set up the SSL/TLS structurec> . Si je relance le sketch tout est normal a nouveau. je comprend pas ce qu'il se passe. Merci a l avance de votre aide.

#include "RTC.h"
#include <NTPClient.h>
#include <WiFiS3.h>
#include <ESP_Mail_Client.h>
#include <OneWire.h>
#include <DallasTemperature.h>
 #include "arduino_secrets.h"


// Data wire is plugged into digital pin 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire device
OneWire oneWire(ONE_WIRE_BUS);    

// Pass oneWire reference to DallasTemperature library
DallasTemperature sensors(&oneWire);
DeviceAddress tempDeviceAddress; // Nous utiliserons cette variable pour stocker une adresse d'appareil trouvée

//-------------------------
float tempC;  //sensor
float tempC1;//temperature du capteur 1
float tempC2;//temperature du capteur 2
float temperature1; 
float temperature2;//passage de temperature 2
float controletemperature = 22;  // temperature de controle d'alarme
int heuresysteme;  // heure de mise en service  de mesure

char currentDate;// date du jour

//Concerne l'horloge
  //String weekDay = weekDays[timeClient.getDay()];
int weekDay;
int monthDay;
int currentMonth;
int currentYear ; 
int currentHour;
int currentMinute;
int numero;


const unsigned long second = 1000;
const unsigned long minute = 60000;


// tous les tests boolean
bool demarre;
bool testSent = true;
bool timeUpdated = false;
bool sendMessage = true; // envoyer une notification à la mise sous tension.


//Nom des jours
String weekDays[7]={"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"};

//Noms des mois 
String months[12]={"Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Decembre"};

// tous les string
String messagemail;
String messagegeneral;
String messageenvoye;
String messagemail1a;
String messagemail2a;
String formattedTime;
String tempe1 , tempe2;

int deviceCount = 0; // pour la mesure de temperature
//------nouveau
int led =  LED_BUILTIN;
int status = WL_IDLE_STATUS;
WiFiServer server(80);
//--------fin nouveau
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org");
// mise en communication wifi
#define WIFI_SSID "Freebox-number"
#define WIFI_PASS "motDePasse" // pas nécessaire avec le filtrage des adresses MAC
#define SMTP_HOST "smtp.free.fr"
#define SMTP_PORT esp_mail_smtp_port_587
#define AUTHOR_EMAIL "author@free.fr" // Free adresse
#define AUTHOR_PASSWORD "Password"  // App passe
#define RECIPIENT_EMAIL "recipient@free.fr" //@vtext.com transforme un e-mail en message texte Verizon. D'autres transporteurs ont des adresses différentes.
SMTPSession smtp;
Session_Config config; // Declare the Session_Config for user defined session credentials
SMTP_Message message; // Declare the message class

//---------------demarrage------------
void setup(void){
  sensors.begin();    // Mise en marche librairie
  Serial.begin(9600); 
  // locate devices on the bus
  Serial.print("Locating devices...");
  Serial.print("Found ");
  deviceCount = sensors.getDeviceCount();
  Serial.print(deviceCount, DEC);
  Serial.println(" devices.");
  Serial.println("");
}

//----------------connection wifi -----------
void connectwifi(){
  Serial.begin(9600);
  //WiFi.begin(WIFI_SSID);  // WiFi.begin(WIFI_SSID) or 
 WiFi.begin(WIFI_SSID, WIFI_PASS); //depending on if password is necessary
  Serial.println("  ");
  Serial.print("Connecting to Wi-Fi.");
  while (WiFi.status() != WL_CONNECTED){
    Serial.print("je suis a connectWifi"); 
    delay(1000);
  }
  Serial.print(" Connected with IP: ");
  Serial.println(WiFi.localIP());
}

//-----------------------boucle de commande--------------------------
void loop(){
  delay(1000);
     connectwifi(); //connect wifi 
      setRTCtime(); //connect horaire
      WiFi.disconnect(); // deconect
     getTempF(); // connect temperature
    controletemperature= 23;
     
      timeUpdated = true;
      sendMessage = true;
    testSent = true;
    if (currentHour == 9 || currentHour == 12)  {
     controle_normal();  
    }
   //-----Declaration de temps
    //delay(6000); //seconde
    //delay(minute * 10); //  10 minute
    delay(minute * 60); //  1 heure  
}



//-------------test
void controle_normal(){
  getTempF(); // connect temperature
  //----si heuresysteme
   
    Serial.print("il est :");
   Serial.println( String(currentYear) + "-" + String(currentMonth) + "-" + String(monthDay));
   //messagegeneral = ("On est le:"  +  String(monthDay)  + "-" + String(currentMonth) + "-" + String(currentYear) + " " + formattedTime + " " + messagemail1a + " / " + messagemail2a  );
messagegeneral =("test1");
// montre les heures
Serial.print(" il est :");
Serial.print(currentHour) ;
Serial.println(" heures");
Serial.print("heuresysteme  :");
Serial.println(heuresysteme);
Serial.println(" heures");
if (sendMessage == true){  
    setupEmail(); // appel setuEmail
    connectwifi();  //appel connectwifi
   sendEmail();
    //smtp.closeSession(); // cela pourrait-il provoquer un crash ? je ne suis pas sûr que ce soit nécessaire.
    WiFi.disconnect(); // deconnect
    Serial.print("c'est ok mail normal");
    }

/*if  (currentHour == 17){
   Serial.print("il est :");
   Serial.println( String(currentYear) + "-" + String(currentMonth) + "-" + String(monthDay));
   //messagegeneral = ("On est le:"  +  String(monthDay)  + "-" + String(currentMonth) + "-" + String(currentYear) + " " + formattedTime + " " + messagemail1a + " / " + messagemail2a  );
// montre les heures
Serial.print(" il est :");
Serial.print(currentHour) ;
Serial.println(" heures");
Serial.print("heuresysteme  :");
Serial.println(heuresysteme);
Serial.println(" heures");
if (sendMessage == true){  
    setupEmail(); // appel setuEmail
    connectwifi();  //appel connectwifi
   sendEmail();
    //smtp.closeSession(); // cela pourrait-il provoquer un crash ? je ne suis pas sûr que ce soit nécessaire.
    WiFi.disconnect(); // deconnect
    Serial.print("c'est ok mail normal");
}
}*/

   //delay(minute * 60);
}

//-----------horloge-------------
void setRTCtime(){
 // Initialize a NTPClient to get time
  timeClient.begin();
  // Set offset time in seconds to adjust for your timezone, for example:
  // GMT +1 = 3600
  // GMT +8 = 28800
  // GMT -1 = -3600
  // GMT paris = 7600
  timeClient.setTimeOffset(7600);
  timeClient.update();

  time_t epochTime = timeClient.getEpochTime();

  Serial.print("je suis a setRTCtime");
   
  formattedTime = timeClient.getFormattedTime();

  currentHour = timeClient.getHours();
  //Serial.print("Heure: ");
  //Serial.println(currentHour);  

  int currentMinute = timeClient.getMinutes();
 // Serial.print("Minutes: ");
 // Serial.println(currentMinute); 
   
  int currentSecond = timeClient.getSeconds();
  //Serial.print("Secondes: ");
  //Serial.println(currentSecond);  

  String weekDay = weekDays[timeClient.getDay()];
  //Serial.print("Jour: ");
  //Serial.println(weekDay);   

  //Get a time structure
  struct tm *ptm = gmtime ((time_t *)&epochTime); 

  monthDay = ptm->tm_mday;
  //Serial.print("Jour: ");
  //Serial.println(monthDay);

  currentMonth = ptm->tm_mon+1;
  //Serial.print("Mois: ");
  //Serial.println(currentMonth);

  String currentMonthName = months[currentMonth-1];
  //Serial.print("Mois: ");
  //Serial.println(currentMonthName);

  currentYear = ptm->tm_year+1900;
  //Serial.print("Année: ");
  //Serial.println(currentYear);
  //Print complete date:
  String currentDate = (String(monthDay) + "-" + String(currentMonth) + "-" + String(currentYear));
  //Serial.print(currentDate);
  Serial.println("");
  delay(2000);
}
//---------------------------temperature----------------
void getTempF() {
// Send command to all the sensors for temperature conversion
  sensors.requestTemperatures(); 
  
  // Display temperature from each sensor
  for (int i = 0;  i < deviceCount;  i++)
  { numero = i +1;
  Serial.print("je suis get temp");
     if (numero = 1) {
    Serial.println(tempC);
     tempC1 = sensors.getTempCByIndex(i);
      Serial.print("Temperature 1  :");
    Serial.println(tempC1);
   }  
   if (i = 1)
    {
     tempC2 = sensors.getTempCByIndex(i);
       Serial.print("Temperature 2  :");
    Serial.println(tempC2);
  }
  }
 temperature1 = tempC1;
  temperature2 = tempC2;
 
//Serial.println(temperature1);  
 controletemperature = controletemperature + 1;
//Serial.println(temperature2);

  if (controletemperature <= temperature1) {
    Serial.print("controle") ;
    Serial.println(controletemperature);
    Serial.print("temperature");
    Serial.println(temperature1);
    // si la temperature est inferieur
    message.subject = "ALARM"; 
    messagemail1a = ("la temperature du congelateur 1 est anormale = " + String(temperature1, 1) + " Deg C");
    
    Serial.println(messagemail1a);
  } else {
    message.subject = "Notification";
 Serial.print("controle") ;
    Serial.println(controletemperature);
    Serial.print("temperature");
    Serial.println(temperature1);
  messagemail1a = ("la temperature du congelateur 1 est correct = " + String(temperature1, 1) + " Deg C");
  Serial.println(messagemail1a);
 }
 if (controletemperature <= temperature2) {
    Serial.print("controle") ;
    Serial.println(controletemperature);
    Serial.print("temperature");
    Serial.println(temperature2);
    message.subject = "ALARM"; 
    //message.text.content = "la temperature du congelateur 2 est basse = " + String(temperature2, 1) + " Deg C";
     messagemail2a = ("la temperature du congelateur 2 est anormale = " + String(temperature2, 1) + " Deg C"); 
   Serial.println(messagemail2a);
  } else {
    message.subject = "Notification";
 Serial.print("controle") ;
    Serial.println(controletemperature);
    Serial.print("temperature");
    Serial.println(temperature2);
     messagemail2a = ("la temperature du congelateur 2 est correct = " + String(temperature2, 1) + " Deg C");
     Serial.println(messagemail2a);
 }
 Serial.print("message  :");
 messagegeneral =("test1");
//messagegeneral = ("On est le:"  +  String(monthDay)  + "-" + String(currentMonth) + "-" + String(currentYear) + " " + formattedTime + " " + messagemail1a + " / " + messagemail2a  );
Serial.println(messagegeneral);
  message.text.content = messagegeneral;
  delay(1000);
}


//----------------------------------------------------------------------------------
void setupEmail(){
  Serial.print("jesuis setupEmail");
  config.server.host_name = SMTP_HOST; // Set the session config
  config.server.port = SMTP_PORT;
  config.login.email = AUTHOR_EMAIL;
  config.login.password = AUTHOR_PASSWORD;
    config.login.user_domain = F("127.0.0.1"); // not having this might have been causing a crash?         **** 

  message.sender.name = "Congelateur"; // Setup the email message
  message.sender.email = AUTHOR_EMAIL;  
  message.clearRecipients();
  message.addRecipient(F("Serge"), RECIPIENT_EMAIL);

   //RTC.getTime(currentTime);
  float gmtOffset = 19.0; // GMT offset in hour (7 + 12 per Send_HTML.ino)
  //smtp.setSystemTime(currentTime.getUnixTime(), gmtOffset);
}


//-----------------------test
/*void sendEmail(){
Serial.println(" c'est ok je suis a sendmail et j'envoie le mail");
}*/
 
//-----------------------envoie mail
void sendEmail(){
Serial.print(" c'est ok j 'envoie le mail");

 smtp.setTCPTimeout(10); // not having this might have been causing a crash?                ****
 
  if (!smtp.connect(&config)){
    ESP_MAIL_PRINTF("Connection error, Status Code: %d, Error Code: %d, Reason: %s", smtp.statusCode(), smtp.errorCode(), smtp.errorReason().c_str()); 
    return;
  } else {
    Serial.println("smtp.connect successful");
  }

  // si la connexion est nulle sinon
  if (!smtp.isLoggedIn()){
    Serial.println("\nNot yet logged in.");
    return;
  }
  else{
    if (smtp.isAuthenticated()){
      Serial.println("\nSuccessfully logged in.");
    }else
      Serial.println("\nConnected with no Auth.");
  }

// si mail est nul sinon
  if (MailClient.sendMail(&smtp, &message)) {
    sendMessage = false;
    //unixTimeLastSend = unixTime;
  } else {
    ESP_MAIL_PRINTF("Error, Status Code: %d, Error Code: %d, Reason: %s", smtp.statusCode(), smtp.errorCode(), smtp.errorReason().c_str());
  } 

    }
  

//---------------------fin de connect--------------------
void smtpCallback(SMTP_Status status){
 
  Serial.println(status.info());
  if (status.success()){
    ESP_MAIL_PRINTF("Message sent success: %d\n", status.completedCount());
    ESP_MAIL_PRINTF("Message sent failed: %d\n", status.failedCount());
    for (size_t i = 0; i < smtp.sendingResult.size(); i++) {
      SMTP_Result result = smtp.sendingResult.getItem(i);
      ESP_MAIL_PRINTF("Message No: %d\n", i + 1);
      ESP_MAIL_PRINTF("Status: %s\n", result.completed ? "success" : "failed");
      ESP_MAIL_PRINTF("Date/Time: %s\n", MailClient.Time.getDateTimeString(result.timestamp, "%B %d, %Y %H:%M:%S").c_str());
      ESP_MAIL_PRINTF("Recipient: %s\n", result.recipients.c_str());
      ESP_MAIL_PRINTF("Subject: %s\n", result.subject.c_str());
    }
  }
 Serial.println("----------------");
    smtp.sendingResult.clear(); // Vous devez effacer le résultat de l'envoi car l'utilisation de la mémoire augmentera.
}

/*
// function to print a device address
void printAddress(DeviceAddress deviceAddress) {
  for (uint8_t i = 0; i < 8; i++) {
    if (deviceAddress[i] < 16) Serial.print("0");
      Serial.print(deviceAddress[i], HEX);
  }
}*/

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

Désolé j' ai pas fait attention

Il faut éviter de mettre en clair les mots de passe et les adresses mail.
Je les ai brouillés.

Tu as des Serial.print() un peu partout. Qu'est-ce que tu vois sur la console?

Ton code est trop complexe, il faut tester sur un code simplifié, qui teste uniquement l'envoi de mails à 6 heures d'écart. Si ça marche, tu sauras que le problème vient d'autre part, si ça ne marche, on cherchera pourquoi.

J'ai fait un petit tuto sur l'utilisation de la bibliothèque ESP-Mail-Client :

J'ai vu une différence sur le #define SMTP_PORT, peut-être que le problème vient de là ?

je dois partir 2 semaines en écosse donc je testerais au retour merci lesept pour ton aide

Bon voyage ! C'est pour le foot ? Ils ont besoin d'un entraineur ? :yum:

REBONJOUR JE SUIS DE RETOUR
après réflexion je pense avoir résolu mon problème
j'ai crée une nouvelle procédure envoie et j'ai mis un delay de 30 minutes et j'ai modifié le delay de loop a 30 minutes également.ce qui remplace le delay precedent de loop de 60 minutes. Et ca marche .

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.