Mon alarme DIY – Test de l’envoi d’emails depuis un arduino

Dans le cadre de l’alarme, il me faudra pouvoir envoyer des notifications (sms, email, …). Aujourd’hui j’ai testé l’envoi d’emails via un arduino. Je vous passe la description du code, il s’agit simplement de se connecter via ethernet à un serveur SMTP et d’envoyer des commandes SMTP de la même manière que vous pourriez le faire depuis telnet. Internet  regorge d’exemples si vous désirez plus de détails.

Le code

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

/*** Configuration réseau ***/
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 1, 177);
IPAddress my_dns(212, 27, 40, 240);
IPAddress gateway(192, 168, 1, 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
    sendEmail("xxxx@gmail.com", "xxxx@gmail.com", "sujet", "corps");
  
}
// Envoi de l'email
/* Exemple d'envoi d'un email avec telnet : 
$ 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
EHLO arduino
250-smtp5-g21.free.fr
250-PIPELINING
250-SIZE 35000000
250-VRFY
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
MAIL From:<xxx@gmail.com>
250 2.1.0 Ok
RCPT To:<xxx@gmail.com>
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
To: xxx@gmail.com
Subject: an email
This is the body
Yeahhhsss!
.
250 2.0.0 Ok: queued as 216E6D480A3
*/
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() {
}

Suivre les commetaires avec le flux RSS 2.0. Vous pouvez laisser un comentaire, or trackback depuis votre site.

6 Commentaires »

 
  • srg dit :

    Je faisais pareil au début, malheureusement çà ne marche (évidemment) pas en l’état avec gmail, qui utilise un SMTP authentifié. Et il n’y a à ma connaissance aucune librairie Arduino pour gérer çà, tout le monde estimant par ailleurs que c’est au delà des capacités de la plateforme que de gérer le cryptage des échanges en TLS avec un serveur de mail.
    Dommage, parce que du coup, il est difficile de nos jours de trouver des SMTP ne nécessitant qu’un login/password (hors certains FAI genre free). Et bâtir une solution de notification qui a ce prérequis là (être chez un fournisseur d’accès « compatible » m’embête un peu).

  • Fritz dit :

    J’ai mis un peu de temps à voir ton commentaire, il était passé dans les indésirables pour une raison qui m’échappe…

    Je suis assez d’accord avec ton commentaire. Ici la notification par mail ne sera qu’un « + ». Par définition on n’est pas devant sa messagerie toute la journée. C’est plus pour information/trace au final.

    La notification importante se fera via sms.

  • Wood dit :

    Alors la il y a quelque chose qui m’échappe ….
    Tu utilises les paramètres free mais l’adresse d’envois est xxx@gmail.com il fa falloir m’expliquer car la je comprends pas tout

  • Fritz dit :

    Je ne vois pas le souci. DEpuis un SMTP Free tu peux envoyer un email sur n’importe quelle adresse email (google, yahoo, free, …)

  • superorage dit :

    Salut!

    J’aimerai savoir : le script ci – haut s’exécutent sous quel environnement ou langage (car je développe en VB et j’aimerais aborder le C Sharp bientôt.)?

  • marc dit :

    J’ai réalisé une alarme basé sur Arduino pour la partie électronique, mais qui est connecté à un PC pour assurer la communication avec l’extérieur (et qui permet aussi d’utiliser ZoneMinder)

    Plus d’info ici :
    http://dev.kprod.net/?q=aalarm-v2-intrusion-detection-using-arduino-alarm-with-django-and-perl

 

Laisser un commentaire

XHTML : Vous pouvez utiliser ces balises : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>