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