arduino et envoie de mail

Bonsoir,
J’ai passé le dernier week end à faire fonctionner le sketch ci-dessous mais sans résultat;
quelqu’un a t il déja essayé?
celui-ci me semble trop simple et notamment il n’y a pas d’adresse email.
Pour ma part j’ai une box Neuf/SFR et j’ai dévérouillé la limitation d’accès
Voila ce que je veux faire : sur une action d’un capteur envoyer un email sur ma boite.

/*
SEND AN EMAIL WITH ARDUINO
9/23/11
This code was created by modifying the connect example from arduino.cc 
and with the help of the YABB forums and their very helpful members.
This code sends an email to any email address and then disconnects.
*/

#include <SPI.h>
#include <Ethernet.h>
#include <Server.h>
#include <Client.h>

byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x81, 0xB4 }; // Arduino's artificial mac address
byte ip[] = { 192, 168, 1, 56 }; // my ip
byte server[] = { 109, 0, 66, 10 }; // my smtp.sfr.net server ip
byte passerelle[] = { 192, 168, 1, 1 }; // my smtp
byte masque[] = { 255, 255, 255, 0 }; // my smt


Client client(server, 110);

void setup()
{
  Ethernet.begin(mac, ip);
 Serial.begin(115200);

 delay(1000);

 Serial.println("connecting...");
 
 if (client.connect()) {
                        Serial.println("connected");
   
                        client.println("HELO itismeletschat"); /* say hello (statement after helo is needed but irrelevant)*/

                        client.println("MAIL From: me@my-isp.net"); /* identify sender, this should be the same as the smtp server you are using */

                        client.println("RCPT To: you@your-isp.net"); /* identify recipient */

                        client.println("DATA"); 

                        client.println("To: you@your-isp.net"); /* identify recipient */
                        client.println("Subject: You Have Arduino Mail!!"); /* insert subject */

                        client.println("Please let me know it worked!!!"); /* insert body */
                        client.println("."); /* end email */
                 
                        client.println("QUIT"); /* terminate connection */
                        
                        client.println();
   
 } else {
   Serial.println("connection failed");
 }
}

void loop()
{
   delay(10000);
   if (!client.connected()) {
   Serial.println();
   Serial.println("disconnecting.");
   client.stop();
   for(;;)
     ;
 }
}

Edit : mise en forme code / Lionel - Snootlab

Bonjour,

Adresses IP du stmp de sfr valide (nslookup smtp.sfr.fr ou ping smtp.sfr.fr pour vérifier) ? Adresse IP du routeur et de l'arduino ok ? Pourquoi port 110 !? Le protocole SMTP est sur le port 25 ! Adresse email de l'émetteur et du destinateur valide ?

Ps: met ton code entre balise code (le # dans l'éditeur) Jean-Francois a déjà suffisamment de travail pas la peine de lui en rajouter ;)

de plus il manque un println vide entre le sujet et le corps

client.println("Subject: You Have Arduino Mail!!"); /* insert subject / **client.println("");* client.println("Please let me know it worked!!!"); /* insert body */

OU

client.println("Subject: You Have Arduino Mail!!\r\n"); /* insert subject / client.println("Please let me know it worked!!!"); / insert body */ Il faudra p-e aussi prévoir de l'authentification en amont (ou se connecter directement sur le MX du domaine de réception :) )

D.

Bonjour et merci pour vos réponses @skywood: OK pour la présentation du code.......

Sinon: j'ai vérifié l'IP de SFR: elle est OK; le SMTP de SFR se fait sur le port 110 (confirmé par SFR) adresse le l'émetteur: l'émetteur est l'Arduino; difficile de lui donner une adresse; du moins je ne sais pas faire. Mais des adresses de l'émetteur et du destinataire sont dans des zones "texte" non? @bbs: je vais essayer en rajoutant cette ligne mais j'ai peur que ça ne suffise pas. Lorsque je lance le script j'ai dans la fenètre série: "connecting... "connection failed "disconnecting. comme si la condition "If.... ne s'exécutait pas

Pourriez vous m'en dire plus?

belibaste:
Bonjour et merci pour vos réponses
@skywood: OK pour la présentation du code…

Sinon: j’ai vérifié l’IP de SFR: elle est OK; le SMTP de SFR se fait sur le port 110 (confirmé par SFR)
adresse le l’émetteur: l’émetteur est l’Arduino; difficile de lui donner une adresse; du moins je ne sais pas faire.
Mais des adresses de l’émetteur et du destinataire sont dans des zones “texte” non?
@bbs: je vais essayer en rajoutant cette ligne mais j’ai peur que ça ne suffise pas.
Lorsque je lance le script j’ai dans la fenètre série:
"connecting…
"connection failed
"disconnecting.
comme si la condition "If… ne s’exécutait pas

Pourriez vous m’en dire plus?

C’est bizarre qu’SFR prenne des largesses avec les normes, le 110 étant le port pour le POP3, c’est à dire pour relever les mails.

J’espère que le mail de destination est en SFR.fr.
Je viens de vérifier mais le SMTP de SFR n’est pas l’ip fournie (109.0.66.10 qui n’écoute ni sur le 25 ni 110 ni 465):

$ dig MX sfr.fr. @8.8.8.8 +short
10 smtp-in.sfr.fr.
$ dig MX sfr.net. @8.8.8.8 +short
10 smtp-in.sfr.fr.

$ dig A smtp-in.sfr.fr. @8.8.8.8 +short
93.17.128.16
93.17.128.25
93.17.128.86
93.17.128.7
93.17.128.123

À quel domaine essaye tu d’envoyer tes mails et surtout un ou plusieurs destinataire ?

D.

j’essaye d’envoyer l’email à mon adresse, sur le même micro et uniquement à moi; en fait j’ai une adresse en @neuf.fr; on m’a dit qu’il y avait une redirection vers neuf

Essaye en utilisant une des 5 IP données (avec le 110 mais aussi avec le port 25):

93.17.128.16 93.17.128.25 93.17.128.86 93.17.128.7 93.17.128.123

D.

On avance......... J'ai 2 de tes adresses qui ouvrent avec le port 25 mais je n'ai pas reçu d'email et la connection ne s'est pas refermée comment as-tu trouvé ces adresses?

Avec les commandes de mon bloc code de mon antépénultième post.

essaye a partir de ta machine de dialoguer avec le serveur distant en utilisant telnet:
Démarrer => Executer … => CMD
dans la jolie boite noire: “telnet <'ip à joindre> 25”
Sous windows 7 il faut l’installer, c’est devenu un module optionnel (composant de windows)

et fait le dialogue que l’arduino est censé faire, tu verra comment le serveur SMTP distant te répond.

D.

Bonsoir à tous !!

(hé oui le pro du email en smtp est là XD)

Pour commencer test ton “programme” d’envoie d’email sur telnet ! Si ça y marche alors il faudrait regarder ton code d’un peu plus près !

A plus !!

NB par gentillesse je te file le miens qui fonctionne à merveille :wink:

byte server = { 212,27,48,4 }; // Free

// Début email
Client client(server, 25);
delay(2000);
Serial.println(F(“connexion au serveur smtp en cours…”));
if (client.connect()) {
Serial.println(F(“connexion serveur smtp ok”));
Serial.println(F(“patientez durant l’envoie…”));
delay(2000);
client.println(F(“EHLO tonprénom.tonnom”));
delay(2000);
client.println(F(“MAIL FROM:adresseemail@free.fr”));
delay(500);
client.println(F(“RCPT TO:xxxx@xxxx.com”));
delay(500);
client.println(F(“DATA”));
delay(500);
client.println(F(“From: Arduino adresseemail@free.fr”));
delay(500);
client.println(F(“Subject: Arduino Erreur”));
delay(500);
client.println(F(“To: xxxx@xxxx.com”));
delay(500);
client.println(F(""));
delay(500);
client.println(F("-----------------------BEUG ARDUINO-------------
-----------"));
delay(500);
client.println(F(""));
delay(500);
if (type_erreur == 0){
client.println(F(“Porte ferme mais verrou ouvert après 5
tentatives de fermeture !”));
}
else if(type_erreur == 1){
client.println(F(“Porte ouverte et verrou ouvert !”));
}
else if(type_erreur == 2){
client.println(F(“Porte ouverte mais verrou ferme !”));
}
else if(type_erreur == 3){
client.println(F(“Porte non ferme au bout de dix minutes !!!”));
}
delay(500);
client.println(F("."));
delay(500);
client.println(F(""));
delay(5000);
client.println(F(“quit”))
;
delay(500);
}
else {
Serial.println(F(“connection serveur smtp echoue”));
}
if (client.connected()) {
Serial.println(F(“envoie de l’email ok”));
Serial.println(F(“deconnexion du serveur smtp”));
client.stop();
}
// Fin email

Merci à tous Avec les adresses que j'ai récupéré j'ai bien la connection et la déconnection mais je n'ai pas d'email dans mes boites........ j'ai peur que l'adresse ne soit toujours pas bonne

@J&JB: c'est quoi ce F dans les lignes. J'ai une erreur qd je compile ?

C'est une méthode pour stocker les messages en Flash, ça permet de moins prendre de place dans l'arduino. Mais il suffit que tu les enlèves avec les parenthèses qui vont avec et c'est bon ;)

As-tu testé via telnet ?

F = Flash je suis idiot.......... J'ai voulu utiliser telnet: j'ai fait telnet + adresse + port et j'ai eu ça comme réponse #220 msfrf 2218.sfr.fr ESMTP ABO*******# je ne sais pas ce que ça veut dire et je ne sais pas quoi faire de plus Je m'excuse mais programmeur ce n'est pas mon métier..........

belibaste: Merci à tous Avec les adresses que j'ai récupéré j'ai bien la connexion et la déconnexion mais je n'ai pas d'email dans mes boites........ j'ai peur que l'adresse ne soit toujours pas bonne

Et dans les spam ? Les mails envoyé depuis les serveurs SMTP des FAI sont souvent banni ... sur gmail par exemple les mails sont carrément refusé.

belibaste: @J&JB: c'est quoi ce F dans les lignes. J'ai une erreur qd je compile ?

http://www.arduino.cc/en/Reference/PROGMEM http://arduino.cc/pipermail/developers_arduino.cc/2011-March/004714.html

Voici a quoi ressemble un dialogue complet SMTP, à adapter bien sur.

Dans ce que dit le serveur, seuls le bloc de 3 chiffres est important:
2xx: commande accepté
3xx: en attente de la suite
4xx: erreur temporaire (voir le message donné)
5xx: erreur permanente (voir le message donné)

Notes:

  • Un mail se termine par un . seul sur la ligne
  • Les entêtes (Bloc contenant From: To: et Subject: ) est séparé du corps par une ligne vide
  • Pour commencer évite tout les accents, c cédille etc etc

Ce que le serveur dit
Ce que tu lui répond

$ telnet mon.smtp 25
Trying xxxx::1…
Connected to mon.smtp.
Escape character is ‘^]’.
220 mon.smtp ESMTP
HELO arduino
250 mon.smtp
MAIL FROM:
250 ok
RCPT TO:
250 ok
DATA
354 go ahead punk, make my day
From:
To:
Subject: test from telnet

test
test
test
.
250 ok 1322859457 qp 18122 by mon.smtp
QUIT
221 mon.smtp Goodbye.
Connection closed by foreign host.

Les mails envoyé depuis les serveurs SMTP des FAI sont souvent banni … sur gmail par exemple les mails sont carrément refusé.

C’est pour cela que je demandais combien de destinataires il y avait.
Le mieux étant bien sur de se connecter directement sur le MX (d’où la liste des IPs des MX de neuf).

D.

Et ton mail est bien arrivé via telnet ?

Le mien ? oui bien sur :)

pourquoi ?

D.

[édit] attention, j'ai manglé le nom du MX avec mon.smtp, j'aurais du mettre le.mx.du.destinataire à la place pour éviter les contresens :)

Bah il ne reste plus donc qu'a régler un soucis de programmation sur ton arduino ;)

[quote author=Jean & Jean-Baptiste link=topic=80576.msg612680#msg612680 date=1322863488] Bah il ne reste plus donc qu'a régler un soucis de programmation sur ton arduino ;) [/quote]

c'est pas moi qui ai un problème d'envois :) la transac smtp est donné pour que belibaste essaye le dialogue complet en telnet avant de le transposer à son arduino :)

D.

bbs: [quote author=Jean & Jean-Baptiste link=topic=80576.msg612680#msg612680 date=1322863488] Bah il ne reste plus donc qu'a régler un soucis de programmation sur ton arduino ;)

c'est pas moi qui ai un problème d'envois :) la transac smtp est donné pour que belibaste essaye le dialogue complet en telnet avant de le transposer à son arduino :)

D.

[/quote]

Roh là là ... vivement que je me couche xD

Oui en effet qu'il test et après on verra déjà ;)