Envoi de mail

L’envoi de mail via une carte Arduino et un shield Ethernet est possible grace au protocole SMTP. Attention, la procédure décrite ici est basée sur l’utilisation d’une connexion internet via l’opérateur FREE. Pour tester l’envoi de mail nous avons d’utiliser TELNET sous UBUNTU :

1°) Test d’un envoi de mail

a) Sous TELNET :

Les commandes saisies au clavier sont en  vert gras et en italique

telnet smtp.free.fr 25

Trying 212.27.48.4…
Connected to smtp.free.fr.
Escape character is ‘^]’.
220 smtp5-g21.free.fr ESMTP Postfix
250-PIPELINING
250-SIZE 35000000
250-VRFY
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
mail from: expediteur@free.fr
250 2.1.0 Ok
rcpt to: destinataire@gmail.com
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
From: expediteur@free.fr
To: destinataire@gmail.com
Subject: test pour tester !
 
blabla….
blabla….        
.
250 2.0.0 Ok: queued as AC4AED48069
b) Programme Arduino :
 //////////////////// AndroMail 1.3 ///////////////  
 #include <SPI.h>  
 #include <Ethernet.h>/*** Configuration réseau ***/  
 byte mac[] = { 0x00, 0xAD, 0xBE, 0xEF, 0xFE, 0x50 }; //-- Addresse MAC à adapter  
 IPAddress ip(192,168,0,50); //-- Adresse IP à adapter  
 EthernetServer serveurHTTP(80); //-- objet serveur utilisant le port 80 = port HTTPIPAddress my_dns(192, 168, 0, 254);  
 IPAddress gateway(192, 168, 0, 254);  
 IPAddress subnet(255, 255, 255, 0);  
 /*** Configuration SMTP ***/  
 IPAddress smtpIp(212,27,48,4); // smtp.free.fr  
 int smtpPort = 25;  
 /*** Variables globales ***/  
 EthernetClient clientsmtp;  
 /*** setup ***/  
 void setup() {  
 // Port série pour debug  
 Serial.begin(9600);  
 //---- initialise le serveur ----  
 delay(1000);  
 Ethernet.begin(mac, ip, my_dns, gateway, subnet);  
 delay(1000);  
 Serial.print("AndroMail 1.3 : L'adresse IP est : " );  
 Serial.println(Ethernet.localIP());  
 delay(1000);  
 // Envoi d'un mail : destinataire, expéditeur, sujet, corps du mail  
 sendEmail("bretzel@free.fr", "andrologiciels@gmail.com",  
 "sujet test", "corps du mail");  
 //  
 }  
 void sendEmail(char* from, char* to, char* subject, char* body) {  
 char data[200];  
 Serial.println("Connexion...");  
 //Serial.println(client.connect(smtpIp, smtpPort));  
 if (clientsmtp.connect(smtpIp, smtpPort)) {  
 Serial.println("Connection OK !");  
 //  
 delay(2000);  
 retourclient();  
 //  
 telnetCmd("EHLO arduino\n");  
 //delay(1000);  
 sprintf(data, "MAIL From:<%s>\n", from);  
 telnetCmd(data);  
 //delay(1000);  
 sprintf(data, "RCPT To:<%s>\n", to);  
 telnetCmd(data);  
 //delay(1000);  
 sprintf(data, "DATA\n");  
 telnetCmd(data);  
 sprintf(data, "Subject: %s\nFrom: %s\nTo: %s\n%s\n.\n", subject, from, to, body);  
 telnetCmd(data);  
 }  
 else {  
 Serial.println("Connexion impossible");  
 }  
 delay(9000);  
 clientsmtp.stop();  
 }  
 // Envoi d'une commande telnet  
 // On n'analyse pas le retour, on suppose que la commande est bonne  
 void telnetCmd(char* command) {  
 if (clientsmtp.connected()) {  
 Serial.print("> ");  
 Serial.println(command);  
 clientsmtp.print(command);  
 }  
 //  
 delay(2000);  
 retourclient();  
 }  
 void retourclient()  
 {//-- Lecture code retour  
 char c;  
 while (clientsmtp.available())  
 {c = clientsmtp.read();  
 Serial.print(c);  
 }  
 }  
 void loop() {  
 }  

Le code source est ici

c) Résultat :

 AndroMail 1.3 : L'adresse IP est : 192.168.0.50  
 Connexion...  
 Connection OK !  
 220 smtp3-g21.free.fr ESMTP Postfix  
 > EHLO arduino  
 250-smtp3-g21.free.fr  
 250-PIPELINING  
 250-SIZE 35000000  
 250-VRFY  
 250-ETRN  
 250-ENHANCEDSTATUSCODES  
 250-8BITMIME  
 250 DSN  
 > MAIL From:<bretzel@free.fr>  
 250 2.1.0 Ok  
 > RCPT To:<andrologiciels@gmail.com>  
 250 2.1.5 Ok  
 > DATA  
 354 End data with <CR><LF>.<CR><LF>  
 > Subject: sujet test  
 From: bretzel@free.fr  
 To: andrologiciels@gmail.com  
 corps du mail  
 .  
 250 2.0.0 Ok: queued as 47E50A61D3  

2°) Envoi d’un fichier attaché :

La zone de délimitation est fixée par une limite « boundary ». La valeur de cette limite est obtenue en affichant le code source d’un mail (sous Gmail, « Afficher l’original »). La déclaration de la limite se fait sur la ligne définissant le contenu. La fin de limite est déterminée par « –« limite »–« .

a) Test sous TELNET :
 telnet smtp.free.fr 25  
 Trying 212.27.48.4...  
 Connected to smtp.free.fr.  
 Escape character is '^]'.  
 220 smtp1-g21.free.fr ESMTP Postfix  
 ehlo smtp.free.fr  
 250-smtp1-g21.free.fr  
 250-PIPELINING  
 250-SIZE 35000000  
 250-VRFY  
 250-ETRN  
 250-ENHANCEDSTATUSCODES  
 250-8BITMIME  
 250 DSN  
 mail from: bretzel@free.fr  
 250 2.1.0 Ok  
 rcpt to: andrologiciels@gmail.com  
 250 2.1.5 Ok  
 data  
 354 End data with <CR><LF>.<CR><LF>  
 Subject: Test envoi fichier attache  
 From: Andro <bretzel@free.fr>  
 To: Andrologiciels <andrologiciels@gmail.com>  
 Content-Type: multipart/mixed; boundary=001a1134121871e6b304f8cbbc2c  
 --001a1134121871e6b304f8cbbc2c  
 Content-Type: multipart/alternative; boundary=001a1134121871e6ab04f8cbbc2a  
 --001a1134121871e6ab04f8cbbc2a  
 Content-Type: text/plain; charset=UTF-8  
 Content-Transfer-Encoding: quoted-printable  
 Corps du mail : ceci est un fichier attache !  
 2nd ligne  
 --001a1134121871e6ab04f8cbbc2a--  
 --001a1134121871e6b304f8cbbc2c  
 Content-Type: application/x-sh; name="test.txt"  
 Content-Disposition: attachment; filename="test.txt"  
 Ceci est le fichier  
 2nd ligne.  
 .  
 250 2.0.0 Ok: queued as 21EF7940131  

d) Le programme Arduino :

 //////////////////// AndroMailFic 1.2 ///////////////  
 #include <SPI.h>  
 #include <Ethernet.h>  
 /*** Configuration réseau ***/  
 byte mac[] = { 0x00, 0xAD, 0xBE, 0xEF, 0xFE, 0x50 }; //-- Addresse MAC à adapter  
 IPAddress ip(192,168,0,50);              //-- Adresse IP à adapter  
 EthernetServer serveurHTTP(80);            //-- objet serveur utilisant le port 80 = port HTTP  
 IPAddress my_dns(192, 168, 0, 254);  
 IPAddress gateway(192, 168, 0, 254);  
 IPAddress subnet(255, 255, 255, 0);  
 /*** Configuration SMTP ***/  
 IPAddress smtpIp(212,27,48,4); // smtp.free.fr  
 int smtpPort = 25;  
 /*** Variables globales ***/  
 EthernetClient clientsmtp;  
 /*** setup ***/  
 void setup() {  
    // Port série pour debug  
   Serial.begin(9600);  
   //---- initialise le serveur ----  
   delay(1000);   
   Ethernet.begin(mac, ip, my_dns, gateway, subnet);  
   delay(1000);   
   Serial.print("AndroMailFichier 1.2 : L'adresse IP est : " );  
   Serial.println(Ethernet.localIP());  
   delay(1000);   
   // Envoi d'un mail  
   sendEmail("Bretzou","bretzel@free.fr", "AndroLogiciels","andrologiciels@gmail.com",   
        "Test envoi fichier", "corps du mail");  
 }  
 void sendEmail(String NomFrom, String from, String NomTo, String to, String subject, String body) {  
   Serial.println("Connexion...");  
   if (clientsmtp.connect(smtpIp, smtpPort)) {  
    Serial.println("Connection OK !");  
    //  
    delay(2000);   
    retourclient();  
    //  
    telnetCmd("EHLO arduino"); //-- Nom du serveur de messagerie  
    telnetCmd("MAIL From: "+from);     
    telnetCmd("RCPT To: "+to);  
    telnetCmd("DATA");     
    telnetCmd("Subject: "+subject);  
    telnetCmd("From: "+NomFrom+" <"+from+">");  
    telnetCmd("to: "+NomTo+" <"+to+">");  
    //** Corps du mail  
    telnetCmd("Content-Type: multipart/mixed; boundary=001a1134121871e6b304f8cbbc2c\n");   
    telnetCmd("--001a1134121871e6b304f8cbbc2c");   
    telnetCmd("Content-Type: multipart/alternative; boundary=001a1134121871e6ab04f8cbbc2a\n");   
    telnetCmd("--001a1134121871e6ab04f8cbbc2a");   
    telnetCmd("Content-Type: text/plain; charset=UTF-8\n");   
    //telnetCmd("Content-Transfer-Encoding: quoted-printable");   
    telnetCmd("Corps du mail : ceci est un fichier attache !");   
    telnetCmd("2nd ligne");  
    telnetCmd("\n");  
    /****Remarque pour écrire en HTML :  
    --001a1134121871e6b304f8cbbc2c  
    Content-Type: text/html; charset=UTF-8  
    <div dir="ltr"><pre style="color:rgb(0,0,0);word-wrap:break-word;white-space:pre-wrap">  
    Corps du mail : ceci est un fichier attache !  
    2nd ligne</pre></div>  
    ****/  
    //** Pièce jointe    
    telnetCmd("--001a1134121871e6ab04f8cbbc2a--");   
    telnetCmd("--001a1134121871e6b304f8cbbc2c");   
    telnetCmd("Content-Type: application/x-sh; name=\"test.txt\"");   
    telnetCmd("Content-Disposition: attachment; filename=\"test.txt\"");   
    //** Contenu du fichier  
    telnetCmd("Ceci est le fichier");   
    telnetCmd("2nd ligne");   
    telnetCmd("3ième ligne");  
    //** ENvoi du mail     
    telnetCmd(".");  
  }  
   else {  
    Serial.println("Connexion impossible");  
   }  
   delay(9000);  
   clientsmtp.stop();  
 }  
 // Envoi d'une commande telnet  
 // On n'analyse pas le retour, on suppose que la commande est bonne  
 void telnetCmd(String command) {  
   if (clientsmtp.connected()) {  
     Serial.print("> ");  
     Serial.println(command);  
     clientsmtp.println(command);  
   }   
   //  
   delay(2000);   
   retourclient();  
 }  
 void retourclient()  
 {//-- Lecture code retour  
  char c;  
  while (clientsmtp.available())  
  {c = clientsmtp.read();   
  Serial.print(c);  
  }  
 }  
 void loop() {  
 }  

Le code est ici 

3°) Test de l’envoi d’un mail avec le corps du mail en caractères avec des attributs (couleur, gras…) :

a) Résultat à obtenir :

ecranpng2

b) Le code arduino :

Il suffit de copier les valeurs HTML du texte obtenu en affichant le code source du message et de l’insérer :

 //////////////////// AndroMailHtmlFic 1.0 ///////////////  
 #include <SPI.h>  
 #include <Ethernet.h>  
 /*** Configuration réseau ***/  
 byte mac[] = { 0x00, 0xAD, 0xBE, 0xEF, 0xFE, 0x50 }; //-- Addresse MAC à adapter  
 IPAddress ip(192,168,0,50);              //-- Adresse IP à adapter  
 EthernetServer serveurHTTP(80);            //-- objet serveur utilisant le port 80 = port HTTP  
 IPAddress my_dns(192, 168, 0, 254);  
 IPAddress gateway(192, 168, 0, 254);  
 IPAddress subnet(255, 255, 255, 0);  
 /*** Configuration SMTP ***/  
 IPAddress smtpIp(212,27,48,4); // smtp.free.fr  
 int smtpPort = 25;  
 /*** Variables globales ***/  
 EthernetClient clientsmtp;  
 /*** setup ***/  
 void setup() {  
    // Port série pour debug  
   Serial.begin(9600);  
   //---- initialise le serveur ----  
   delay(1000);   
   Ethernet.begin(mac, ip, my_dns, gateway, subnet);  
   delay(1000);   
   Serial.print("AndroMailFichierHtml 1.0 : L'adresse IP est : " );  
   Serial.println(Ethernet.localIP());  
   delay(1000);   
   // Envoi d'un mail  
   sendEmail("Bretzou","bretzel@free.fr", "AndroLogiciels","andrologiciels@gmail.com",   
        "Dernier test des Accès hebdomadaires", "Liste des accès hebdomadaires.");  
 }  
 void sendEmail(String NomFrom, String from, String NomTo, String to, String subject, String body) {  
   Serial.println("Connexion...");  
   if (clientsmtp.connect(smtpIp, smtpPort)) {  
    Serial.println("Connection OK !");  
    //  
    delay(2000);   
    retourclient();  
    //  
    telnetCmd("EHLO arduino"); //-- Nom du serveur de messagerie  
    telnetCmd("MAIL From: "+from);     
    telnetCmd("RCPT To: "+to);  
    telnetCmd("DATA");     
    telnetCmd("Subject: "+subject);  
    telnetCmd("From: "+NomFrom+" <"+from+">");  
    telnetCmd("to: "+NomTo+" <"+to+">");  
    //** Corps du mail   
    telnetCmd("Content-Type: multipart/mixed; boundary=f46d04308846b54afb04f9204510\n");   
    telnetCmd("--f46d04308846b54afb04f9204510");  
    telnetCmd("Content-Type: multipart/alternative; boundary=f46d04308846b54ae304f920450e\n");   
    telnetCmd("--f46d04308846b54ae304f920450e");  
    telnetCmd("Content-Type: text/plain; charset=UTF-8");    
    telnetCmd("Content-Transfer-Encoding: quoted-printable\n");  
    telnetCmd("*Ceci est un message important !*");  
    telnetCmd("*"+body+"*");   
    telnetCmd("\n");  
    //****Remarque pour écrire en HTML :  
    telnetCmd("--f46d04308846b54ae304f920450e");   
    telnetCmd("Content-Type: text/html; charset=UTF-8");  
    telnetCmd("Content-Transfer-Encoding: quoted-printable\n");  
    telnetCmd("<div dir=3D\"ltr\"><b><i style=3D\"background-color:rgb(255,0,0)\"><font size=3D\"4\" color=3D\"#ffffff\">Ceci est un message important !</font></i></b><div style><b>"+body+"</b></div></div>");    
    telnetCmd("\n");  
    //** Pièce jointe  
    telnetCmd("--f46d04308846b54ae304f920450e--");     
    telnetCmd("--f46d04308846b54afb04f9204510");   
    telnetCmd("Content-Type: application/x-sh; name=\"test.txt\"");   
    telnetCmd("Content-Disposition: attachment; filename=\"test.txt\"");   
    //** Contenu du fichier  
    telnetCmd("Ceci est le fichier");   
    telnetCmd("2nd ligne");   
    telnetCmd("3ième ligne");  
    //** ENvoi du mail     
    telnetCmd(".");  
  }  
   else {  
    Serial.println("Connexion impossible");  
   }  
   delay(9000);  
   clientsmtp.stop();  
 }  
 // Envoi d'une commande telnet  
 // On n'analyse pas le retour, on suppose que la commande est bonne  
 void telnetCmd(String command) {  
   if (clientsmtp.connected()) {  
     Serial.print("> ");  
     Serial.println(command);  
     clientsmtp.println(command);  
   }   
   //  
   delay(2000);   
   retourclient();  
 }  
 void retourclient()  
 {//-- Lecture code retour  
  char c;  
  while (clientsmtp.available())  
  {c = clientsmtp.read();   
  Serial.print(c);  
  }  
 }  
 void loop() {  
 }  

code source ici

La fenêtre de debug donne :

 AndroMailFichierHtml 1.0 : L'adresse IP est : 192.168.0.50  
 Connexion...  
 Connection OK !  
 220 smtp5-g21.free.fr ESMTP Postfix  
 > EHLO arduino  
 250-smtp5-g21.free.fr  
 250-PIPELINING  
 250-SIZE 35000000  
 250-VRFY  
 250-ETRN  
 250-ENHANCEDSTATUSCODES  
 250-8BITMIME  
 250 DSN  
 > MAIL From: bretzel@free.fr  
 250 2.1.0 Ok  
 > RCPT To: andrologiciels@gmail.com  
 250 2.1.5 Ok  
 > DATA  
 354 End data with <CR><LF>.<CR><LF>  
 > Subject: Dernier test des Accès hebdomadaires  
 > From: Bretzou <bretzel@free.fr>  
 > to: AndroLogiciels <andrologiciels@gmail.com>  
 > Content-Type: multipart/mixed; boundary=f46d04308846b54afb04f9204510  
 > --f46d04308846b54afb04f9204510  
 > Content-Type: multipart/alternative; boundary=f46d04308846b54ae304f920450e  
 > --f46d04308846b54ae304f920450e  
 > Content-Type: text/plain; charset=UTF-8  
 > Content-Transfer-Encoding: quoted-printable  
 > *Ceci est un message important !*  
 > *Liste des accès hebdomadaires.*  
 >   
 > --f46d04308846b54ae304f920450e  
 > Content-Type: text/html; charset=UTF-8  
 > Content-Transfer-Encoding: quoted-printable  
 > <div dir=3D"ltr"><b><i style=3D"background-color:rgb(255,0,0)"><font size=3D"4" color=3D"#ffffff">Ceci est un message important !</font></i></b><div style><b>Liste des accès hebdomadaires.</b></div></div>  
 >   
 > --f46d04308846b54ae304f920450e--  
 > --f46d04308846b54afb04f9204510  
 > Content-Type: application/x-sh; name="test.txt"  
 > Content-Disposition: attachment; filename="test.txt"  
 > Ceci est le fichier  
 > 2nd ligne  
 > 3ième ligne  
 > .  
 250 2.0.0 Ok: queued as 2718FD48052  
3 comments on “Envoi de mail
  1. Rodolphe dit :

    Un ENORME merci. Cela fait une semaine que je galère pour envoyer un Email. Grâce à cette méthode cela fonctionne enfin. MERCI MERCI MERCI

  2. Technoo' dit :

    Merci beaucoup pour le partage ! Fonctionnel !

  3. damien dit :

    Bonjour,
    votre exemple est super, néanmoins il me reste des zones d’ombre ….
    et j’aurai aussi des question

    Zone d’ombre :
    – a quoi corresponde les boundary ?
    – f46d04308846b54afb04f9204510 // f46d04308846b54ae304f920450e // –001a1134121871e6ab04f8cbbc2a– // –001a1134121871e6b304f8cbbc2c
    sont elle des valeur aléatoire ? si non a quoi elles servent ou a quoi elles correspondent pour la pièce jointe

    question :
    – alors voila, je suis actuellement en train de faire un programme qui, pour rester simple vérifie une dizaine de paramètre et qui enregistre tout par jour dans des fichier .txt sur ma carte SD. mais c’est pas le problème car cette partie la fonctionne parfaitement ^^ et je voudrai que l’arduino envoie tout les jours a minuit le fichier .txt par mail.
    j’ai tester votre programme, et j’arrive bien a envoyer des mails, même a envoyer une pièce jointes mais elle reste vide la partie //** Contenu du fichier ne fonctionne pas ..

    merci

Votre commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion /  Changer )

Image Twitter

Vous commentez à l’aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.

Articles récents
Commentaires récents
fatima dans Bienvenue !
AdminDroid dans Bienvenue !
fatima dans Bienvenue !
Archives
Catégories
%d blogueurs aiment cette page :