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
//////////////////// 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 »–« .
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 :
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
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
Merci beaucoup pour le partage ! Fonctionnel !
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