[RESOLU] envoi email +heure

bonjour
je butte sur un petit probleme
j’ai adapté un bout de soft qui me permet d’envoyer un mail si une porte est ouverte ou fermée
il fonctionne, mais 2 anomalies
1- a la reception du mail le champ expediteur "ex sur thunderbird " reste vierge
2- je souhaiterai faire apparaitre dans le champ du message l’heure de lenvoi
car le seul champ d’heure qui apparait est l’heure de l’ouverture de thunderbird
merci pour votre aide si vous pouvier me rajouter les lignes manquantes
cordialement a tous
je joint mon code

#include <SPI.h>
#include <Ethernet.h>
const int contactPorte =2;
boolean porteOuverte = 0;   
boolean EtatPorte = 0;

/*** Configuration réseau ***/
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 100, 32);
IPAddress my_dns(212, 27, 40, 240);
IPAddress gateway(192, 168, 100, 254);
IPAddress subnet(255, 255, 255, 0);

/*** Configuration SMTP ***/
IPAddress smtpIp(212,27,48,4);  // smtp.free.fr
int smtpPort = 25;

/*** Variables globales ***/
EthernetClient client;

/*** setup ***/
void setup() {
    delay(5000);
    // Lancement de la connexion ethernet
    Ethernet.begin(mac, ip, my_dns, gateway, subnet);
    // On attend une seconde que le réseau soit pret
    delay(2000);
    // Port série pour debug
    Serial.begin(9600);

    // Envoi d'un mail
  pinMode(contactPorte, INPUT);
  digitalWrite(contactPorte,HIGH);


}

void sendEmail(char* from, char* to, char* subject, char* body) {
    char data[200];
    Serial.println("Connexion...");
    if (client.connect(smtpIp, smtpPort)) {
      Serial.println("Connecté!");
      telnetCmd("EHLO arduino\n");
      sprintf(data, "MAIL From:<%s>\n", from);
      telnetCmd(data);
      sprintf(data, "RCPT To:<%s>\n", to);
      telnetCmd(data);
      sprintf(data, "DATA\nTo: %s\nSubject: %s\n%s\n.\n", to, subject, body);
      telnetCmd(data);
    }
    else {
      Serial.println("Connexion impossible");
    }
    client.stop();
}

// Envoi d'une commande telnet
// On n'analyse pas le retour, on suppose que la commande est bonne
void telnetCmd(char* command) {
    if (client.connected()) {
        Serial.print("> ");
        Serial.println(command);
        client.print(command);
    }   
    // TODO : implémenter une vérification des codes retour ?
}

void loop() {
    //-------------------------------------------
    porteOuverte = digitalRead(contactPorte);
    if ((porteOuverte==LOW) && (EtatPorte== LOW)) {
    delay(20);
    Serial.println("Fermeture ");//Serial.print(now.day(), DEC);Serial.print("-");Serial.print(now.month(), DEC);Serial.print("-");Serial.print(now.year(), DEC);  Serial.print("/");  Serial.print(now.hour(), DEC);Serial.print("H");Serial.println(now.minute(), DEC);
    sendEmail("xxxxxxxx@free.fr", "xxxxxxx@free.fr", "Acces haut Fermeture", "Fermeture");
    EtatPorte= HIGH;
    delay(200);   
    }

   if ((porteOuverte==HIGH) && (EtatPorte== HIGH)) {
    delay(20);
    Serial.println("*Ouverture ");
    sendEmail("xxxxxxx@free.fr", "xxxxxx@free.fr", "Acces haut Ouverture", "Ouverture");
    EtatPorte= LOW;
    delay(200);
  }
  }//fin loop

bonjour
ci-dessous un code d’envoi de mail (SMTP) avec millis() dans le corps du message
si tu veux envoyer l’heure exacte , il te faut soit la recuperer avec une RTC , soit prealablement à l’envoi la recuperer sur un serveur de temps.

#include <SPI.h>
    #include <Ethernet.h>
     
    // this must be unique
    byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x59, 0x67 };  
    // change network settings to yours
    IPAddress ip( 192, 168, 1, 179 );    
    IPAddress gateway( 192, 168, 1, 1 );
    IPAddress subnet( 255, 255, 255, 0 );
     
    // change server to your email server ip or domain
    // IPAddress server( 1, 2, 3, 4 );
    char server[] = "smtp.orange.fr";
     
    EthernetClient client;
     
    void setup()
    {
      Serial.begin(9600);
      pinMode(4,OUTPUT);
      digitalWrite(4,HIGH);
      Ethernet.begin(mac, ip, gateway, gateway, subnet);
      delay(2000);
      Serial.println(F("Ready. Press 'e' to send."));
    }
     
    void loop()
    {
      byte inChar;
     
      inChar = Serial.read();
     
      if(inChar == 'e')
      {
          if(sendEmail()) Serial.println(F("Email sent"));
          else Serial.println(F("Email failed"));
      }
    }
     
    byte sendEmail()
    {
      byte thisByte = 0;
      byte respCode;
     
      if(client.connect(server,25)) {
        Serial.println(F("connected"));
      } else {
        Serial.println(F("connection failed"));
        return 0;
      }
     
      if(!eRcv()) return 0;
      Serial.println(F("Sending helo"));
     
    // change to your public ip
      client.println(F("helo 192.168.1.179"));
     
      if(!eRcv()) return 0;
      Serial.println(F("Sending From"));
     
    // change to your email address (sender)
      client.println(F("MAIL From: <xxxxxlabs@wanadoo.fr>"));
     
      if(!eRcv()) return 0;
     
    // change to recipient address
      Serial.println(F("Sending To"));
      client.println(F("RCPT To: <xxxnews@aliceadsl.fr>"));
     
      if(!eRcv()) return 0;
     
      Serial.println(F("Sending DATA"));
      client.println(F("DATA"));
     
      if(!eRcv()) return 0;
     
      Serial.println(F("Sending email"));
     
    // change to recipient address
      client.println(F("To:  <xxxxxnews@aliceadsl.fr>")); 
     
    // change to your address
      client.println(F("From:  <xxxxxlabs@wanadoo.fr>"));
     
      client.println(F("Subject: Arduino PHIL email test\r\n"));
     
      client.println(F("This is from my Arduino uno!  millis= "));
      client.println(millis());
     
      client.println(F("."));
     
      if(!eRcv()) return 0;
     
      Serial.println(F("Sending QUIT"));
      client.println(F("QUIT"));
     
      if(!eRcv()) return 0;
     
      client.stop();
     
      Serial.println(F("disconnected"));
     
      return 1;
    }
     
    byte eRcv()
    {
      byte respCode;
      byte thisByte;
      int loopCount = 0;
     
      while(!client.available()) {
        delay(1);
        loopCount++;
     
        // if nothing received for 10 seconds, timeout
        if(loopCount > 10000) {
          client.stop();
          Serial.println(F("\r\nTimeout"));
          return 0;
        }
      }
     
      respCode = client.peek();
     
      while(client.available())
      {  
        thisByte = client.read();    
        Serial.write(thisByte);
      }
     
      if(respCode >= '4')
      {
        efail();
        return 0;  
      }
     
      return 1;
    }
     
     
    void efail()
    {
      byte thisByte = 0;
      int loopCount = 0;
     
      client.println(F("QUIT"));
     
      while(!client.available()) {
        delay(1);
        loopCount++;
     
        // if nothing received for 10 seconds, timeout
        if(loopCount > 10000) {
          client.stop();
          Serial.println(F("\r\nTimeout"));
          return;
        }
      }
     
      while(client.available())
      {  
        thisByte = client.read();    
        Serial.write(thisByte);
      }
     
      client.stop();
     
      Serial.println(F("disconnected"));
      Serial.println(F("Ready. Press 'e' to send."));

merci artouste tu m’a mis sur la voie
j’ai donc pris l’exemple dans la bibliotheque ethernet en j’ai cree un void ntp()
que je vais chercher a chaque action porte ouverte et porte fermee
j’ai donc sur mon moniteur l’heure minute seconde
mais je n’arrive pas a l’integrer a la position body qui actuellement est par exemple “fermeture”
je pense que deja il faudrait que je fasse une chaine heure:minute en char et que je remplace le texte entre “” par cette variable mais cela ne marche pas, je seche
tout le reste du programme fonctionne
je loupe quelque chose
merci

Serial.print("The UTC time is "); // UTC is the time at Greenwich Meridian (GMT)
Serial.print((epoch % 86400L) / 3600); // print the hour (86400 equals secs per day)
Serial.print(’:’);
if (((epoch % 3600) / 60) < 10) {
// In the first 10 minutes of each hour, we’ll want a leading ‘0’
Serial.print(‘0’);
}
Serial.print((epoch % 3600) / 60); // print the minute (3600 equals secs per minute)
Serial.print(’:’);
if ((epoch % 60) < 10) {
// In the first 10 seconds of each minute, we’ll want a leading ‘0’
Serial.print(‘0’);
}
Serial.println(epoch % 60); // print the second
}

bonjour je revient a mon appel au secours
une partie a ete resolue, je trouve maintenant l'heure sur mon moniteur mais je ne sait pas comment l'integrer dans le body du mail a la place de l'existant "fermeture" ou "ouverture"
merci d'essayer de me rajouter lignes manquante
cordialement a tous

#include <SPI.h>
#include <Ethernet.h>
const int contactPorte =2;
boolean porteOuverte = 0;   
boolean EtatPorte = 0;
#include <EthernetUdp.h>

/*** Configuration réseau ***/
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 100, 32);
IPAddress my_dns(212, 27, 40, 240);
IPAddress gateway(192, 168, 100, 254);
IPAddress subnet(255, 255, 255, 0);

/*** Configuration SMTP ***/
IPAddress smtpIp(212,27,48,4);  // smtp.free.fr
int smtpPort = 25;

/*** Variables globales ***/
EthernetClient client;

unsigned int localPort = 8888;       // local port to listen for UDP packets

char timeServer[] = "time.nist.gov"; // time.nist.gov NTP server

const int NTP_PACKET_SIZE = 48; // NTP time stamp is in the first 48 bytes of the message

byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets

// A UDP instance to let us send and receive packets over UDP
EthernetUDP Udp;

/*** setup ***/
void setup() {
    delay(5000);
    // Lancement de la connexion ethernet
    Ethernet.begin(mac, ip, my_dns, gateway, subnet);
    // On attend une seconde que le réseau soit pret
    delay(2000);
    // Port série pour debug
    Serial.begin(9600);
    
    Udp.begin(localPort);
  
    // Envoi d'un mail
    pinMode(contactPorte, INPUT); 
    digitalWrite(contactPorte,HIGH);


}

void sendEmail(char* from, char* to, char* subject, char* body) {
    char data[200];
    Serial.println("Connexion...");
    if (client.connect(smtpIp, smtpPort)) {
      Serial.println("Connecte!");
      telnetCmd("HELO arduino\n");
      sprintf(data, "MAIL From:<%s>\n", from);
      telnetCmd(data);
      sprintf(data, "RCPT To:<%s>\n", to);
      telnetCmd(data);
      sprintf(data, "DATA\nFrom: %s\nSubject: %s\n%s\n.\n", from, subject, body);
      telnetCmd(data);
    }
    else {
      Serial.println("Connexion impossible");
    }
    client.stop();
}

// Envoi d'une commande telnet
// On n'analyse pas le retour, on suppose que la commande est bonne
void telnetCmd(char* command) {
    if (client.connected()) {
        Serial.print("> ");
        Serial.println(command);
        client.print(command);
    }   
    // TODO : implémenter une vérification des codes retour ?
}



void loop() {

    //-------------------------------------------
    porteOuverte = digitalRead(contactPorte);
    if ((porteOuverte==LOW) && (EtatPorte== LOW)) {
      ntp();
    delay(20);
    Serial.println("Fermeture ");

    sendEmail("xxxxx@free.fr", "xxxxx@free.fr", "Acces haut Fermeture","Fermeture");
    EtatPorte= HIGH;
    delay(20);   
    }

   if ((porteOuverte==HIGH) && (EtatPorte== HIGH)) {
    ntp();
    delay(20);
    Serial.println("*Ouverture ");
    sendEmail("xxxxx@free.fr", "xxxxxx@free.fr", "Acces haut Ouverture", "Ouverture");
    EtatPorte= LOW;
    delay(20);
  }
  }//fin loop


  void ntp(){
    
    sendNTPpacket(timeServer); // send an NTP packet to a time server

  // wait to see if a reply is available
  delay(1000);
  if (Udp.parsePacket()) {
    // We've received a packet, read the data from it
    Udp.read(packetBuffer, NTP_PACKET_SIZE); // read the packet into the buffer

    // the timestamp starts at byte 40 of the received packet and is four bytes,
    // or two words, long. First, extract the two words:

    unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
    unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
    // combine the four bytes (two words) into a long integer
    // this is NTP time (seconds since Jan 1 1900):
    unsigned long secsSince1900 = highWord << 16 | lowWord;
  //  Serial.print("Seconds since Jan 1 1900 = ");
  //  Serial.println(secsSince1900);

    // now convert NTP time into everyday time:
  //  Serial.print("Unix time = ");
    // Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
    const unsigned long seventyYears = 2208988800UL;
    // subtract seventy years:
    unsigned long epoch = secsSince1900 - seventyYears;
    // print Unix time:
   // Serial.println(epoch);


    // print the hour, minute and second:
    Serial.print("The UTC time is ");       // UTC is the time at Greenwich Meridian (GMT)
    Serial.print((epoch  % 86400L) / 3600); // print the hour (86400 equals secs per day)
    Serial.print(':');
    if (((epoch % 3600) / 60) < 10) {
      // In the first 10 minutes of each hour, we'll want a leading '0'
      Serial.print('0');
    }
    Serial.print((epoch  % 3600) / 60); // print the minute (3600 equals secs per minute)
    Serial.print(':');
    if ((epoch % 60) < 10) {
      // In the first 10 seconds of each minute, we'll want a leading '0'
      Serial.print('0');
    }
    Serial.println(epoch % 60); // print the second
  }
  // wait ten seconds before asking for the time again
  delay(200);
  Ethernet.maintain();
}

// send an NTP request to the time server at the given address
void sendNTPpacket(char* address) {
  // set all bytes in the buffer to 0
  memset(packetBuffer, 0, NTP_PACKET_SIZE);
  // Initialize values needed to form NTP request
  // (see URL above for details on the packets)
  packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  packetBuffer[1] = 0;     // Stratum, or type of clock
  packetBuffer[2] = 6;     // Polling Interval
  packetBuffer[3] = 0xEC;  // Peer Clock Precision
  // 8 bytes of zero for Root Delay & Root Dispersion
  packetBuffer[12]  = 49;
  packetBuffer[13]  = 0x4E;
  packetBuffer[14]  = 49;
  packetBuffer[15]  = 52;

  // all NTP fields have been given values, now
  // you can send a packet requesting a timestamp:
  Udp.beginPacket(address, 123); //NTP requests are to port 123
  Udp.write(packetBuffer, NTP_PACKET_SIZE);
  Udp.endPacket();
}

Topic illisible à cause de la non utilisation des balises code

Correctement publié, cela devrait ressembler à ceci :

#include <SPI.h>
#include <Ethernet.h>
const int contactPorte =2;
boolean porteOuverte = 0;   
boolean EtatPorte = 0;
#include <EthernetUdp.h>

/*** Configuration réseau ***/
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 100, 32);
IPAddress my_dns(212, 27, 40, 240);
IPAddress gateway(192, 168, 100, 254);
IPAddress subnet(255, 255, 255, 0);

/*** Configuration SMTP ***/
IPAddress smtpIp(212,27,48,4);  // smtp.free.fr
int smtpPort = 25;

/*** Variables globales ***/
EthernetClient client;

unsigned int localPort = 8888;       // local port to listen for UDP packets

char timeServer[] = "time.nist.gov"; // time.nist.gov NTP server

const int NTP_PACKET_SIZE = 48; // NTP time stamp is in the first 48 bytes of the message

byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets

// A UDP instance to let us send and receive packets over UDP
EthernetUDP Udp;

/*** setup ***/
void setup() {
    delay(5000);
    // Lancement de la connexion ethernet
    Ethernet.begin(mac, ip, my_dns, gateway, subnet);
    // On attend une seconde que le réseau soit pret
    delay(2000);
    // Port série pour debug
    Serial.begin(9600);
    
    Udp.begin(localPort);
  
    // Envoi d'un mail
    pinMode(contactPorte, INPUT); 
    digitalWrite(contactPorte,HIGH);


}

void sendEmail(char* from, char* to, char* subject, char* body) {
    char data[200];
    Serial.println("Connexion...");
    if (client.connect(smtpIp, smtpPort)) {
      Serial.println("Connecte!");
      telnetCmd("HELO arduino\n");
      sprintf(data, "MAIL From:<%s>\n", from);
      telnetCmd(data);
      sprintf(data, "RCPT To:<%s>\n", to);
      telnetCmd(data);
      sprintf(data, "DATA\nFrom: %s\nSubject: %s\n%s\n.\n", from, subject, body);
      telnetCmd(data);
    }
    else {
      Serial.println("Connexion impossible");
    }
    client.stop();
}

// Envoi d'une commande telnet
// On n'analyse pas le retour, on suppose que la commande est bonne
void telnetCmd(char* command) {
    if (client.connected()) {
        Serial.print("> ");
        Serial.println(command);
        client.print(command);
    }   
    // TODO : implémenter une vérification des codes retour ?
}



void loop() {

    //-------------------------------------------
    porteOuverte = digitalRead(contactPorte);
    if ((porteOuverte==LOW) && (EtatPorte== LOW)) {
      ntp();
    delay(20);
    Serial.println("Fermeture ");

    sendEmail("lasimiane@free.fr", "mystere.s@free.fr", "Acces haut Fermeture","Fermeture");
    EtatPorte= HIGH;
    delay(20);   
    }

   if ((porteOuverte==HIGH) && (EtatPorte== HIGH)) {
    ntp();
    delay(20);
    Serial.println("*Ouverture ");
    sendEmail("lasimiane@free.fr", "mystere.s@free.fr", "Acces haut Ouverture", "Ouverture");
    EtatPorte= LOW;
    delay(20);
  }
  }//fin loop


  void ntp(){
    
    sendNTPpacket(timeServer); // send an NTP packet to a time server

  // wait to see if a reply is available
  delay(1000);
  if (Udp.parsePacket()) {
    // We've received a packet, read the data from it
    Udp.read(packetBuffer, NTP_PACKET_SIZE); // read the packet into the buffer

    // the timestamp starts at byte 40 of the received packet and is four bytes,
    // or two words, long. First, extract the two words:

    unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
    unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
    // combine the four bytes (two words) into a long integer
    // this is NTP time (seconds since Jan 1 1900):
    unsigned long secsSince1900 = highWord << 16 | lowWord;
  //  Serial.print("Seconds since Jan 1 1900 = ");
  //  Serial.println(secsSince1900);

    // now convert NTP time into everyday time:
  //  Serial.print("Unix time = ");
    // Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
    const unsigned long seventyYears = 2208988800UL;
    // subtract seventy years:
    unsigned long epoch = secsSince1900 - seventyYears;
    // print Unix time:
   // Serial.println(epoch);


    // print the hour, minute and second:
    Serial.print("The UTC time is ");       // UTC is the time at Greenwich Meridian (GMT)
    Serial.print((epoch  % 86400L) / 3600); // print the hour (86400 equals secs per day)
    Serial.print(':');
    if (((epoch % 3600) / 60) < 10) {
      // In the first 10 minutes of each hour, we'll want a leading '0'
      Serial.print('0');
    }
    Serial.print((epoch  % 3600) / 60); // print the minute (3600 equals secs per minute)
    Serial.print(':');
    if ((epoch % 60) < 10) {
      // In the first 10 seconds of each minute, we'll want a leading '0'
      Serial.print('0');
    }
    Serial.println(epoch % 60); // print the second
  }
  // wait ten seconds before asking for the time again
  delay(200);
  Ethernet.maintain();
}

// send an NTP request to the time server at the given address
void sendNTPpacket(char* address) {
  // set all bytes in the buffer to 0
  memset(packetBuffer, 0, NTP_PACKET_SIZE);
  // Initialize values needed to form NTP request
  // (see URL above for details on the packets)
  packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  packetBuffer[1] = 0;     // Stratum, or type of clock
  packetBuffer[2] = 6;     // Polling Interval
  packetBuffer[3] = 0xEC;  // Peer Clock Precision
  // 8 bytes of zero for Root Delay & Root Dispersion
  packetBuffer[12]  = 49;
  packetBuffer[13]  = 0x4E;
  packetBuffer[14]  = 49;
  packetBuffer[15]  = 52;

  // all NTP fields have been given values, now
  // you can send a packet requesting a timestamp:
  Udp.beginPacket(address, 123); //NTP requests are to port 123
  Udp.write(packetBuffer, NTP_PACKET_SIZE);
  Udp.endPacket();
}

Merci d’éditer tes posts précédents pour les rectifier

grosmatou2:
bonjour je revient a mon appel au secours
une partie a ete resolue, je trouve maintenant l'heure sur mon moniteur mais je ne sait pas comment l'integrer dans le body du mail a la place de l'existant "fermeture" ou "ouverture"
merci d'essayer de me rajouter lignes manquante
cordialement a tous

bonjour
mets ton code entre balise code , là ça fait mal au yeux ! 8)
tu peux t'inspirer de ce code (testé OK)

mes excuses
pas fait attention, lecons retenue pour la suite
cordialement

desole artouste mais avec ton code le moniteur me dit connecte puis timeout

grosmatou2:
desole artouste mais avec ton code le moniteur me dit connecte puis timeout

si tu a informé tes propres parametres de connection tu devrais obtenir un truc comme çà dans le monteur serie
et un mail dans ce genre

merci probleme resolu
trouve dans ethernet.begin 2 fois gateway
j'ai remplace le premier gateway par my_dns que j"avais renseigné dans les variables et depuis c'est ok
avec ma commande de porte tout est transmis
merci encore pour ton aide