Invio posta tramite server SMTP

(senza cifratura SSL)

Tramite uno shield ethernet è possibile usare Arduino per inviare mail. Ciò si rivela molto utile per realizzare progetti di domotica e/o videosorveglianza, perchè permette di essere informati immediatamente in caso venga rilevato un determinato evento. I DVR per videosorveglianza economici, per esempio, non sono dotati di funzionalità di invio mail, anche se sono connessi alla rete, ma se hanno un'uscita digitale di allarme, questa può essere facilmente collegata ad Arduino, che può così inviare mail al verificarsi dell'evento di allarme. Oppure si può collegare ad Arduino una fotoresistenza e collocarla sopra a un led-spia di un qualche apparato, in modo che Arduino invii una mail quando il led si accende.

Per poter utilizzare lo sketch che segue, è necessario personalizzare vari parametri:

  1. bisogna configurarlo in modo che lo shield ethernet venga riconosciuto dalla rete casalinga in cui è installato; le impostazioni sono diverse per ogni persona,e si può fare riferimento ad un altro tutorial per stabilire qual è l'IP e il MAC address da inserire.

  2. bisogna sostituire mittente, destinatario, oggetto e corpo del messaggio con quelli desiderati

  3. bisogna scoprire l'indirizzo IP del proprio server di posta; il nome del server si trova nella configurazione del vostro client di posta, sotto "server in uscita"; per scoprirne l'IP, basta inserirlo in questo sito: http://www.visualroute.it/strumenti/dnslookup.asp

  4. bisgona inserire il proprio username e password. Questa è la parte più complessa, percè ormai quasi tutti i provider richiedono l'autenticazione dell'utente per poter inviare e-mail , e per fare ciò è necessario convertire le proprie credenziali di accesso (username e password) in formato "BASE64"; al momento non è disponibile una libreria Arduino che lo faccia, quindi è necessario appoggiarsi "una tantum" a un server esterno per convertire le proprie credenziali, per esempio http://www.motobit.com/util/base64-decoder-encoder.asp e http://webnet77.com/cgi-bin/helpers/base-64.pl

NOTA: NON METTETE USERNAME E PASSWORD NELLO STESSO SITO! E se poi li memorizzano... e li usano?!?

NOTA 2: alcuni provider richiedono di inserire come "username" l'indirizzo di posta completo, cioè ad esempio nomeutente@libero.it invece di nomeutente .

NOTA 3: se chiedete aiuto su un forum a proposito di questa pagina, ATTENTI A NON PUBBLICARE LA VOSTRA PASSWORD PER SBAGLIO!!!

Se infatti pubblicate il log del server SMTP, apparirà la vostra password codificata in BASE64, e chiunque può decodificarla in 2 minuti usando un qualsiasi sito di decodifica online BASE64!!

 >>>AUTH LOGIN 
 <<<530 5.7.0 Must issue a STARTTLS command first.  v17sm8284696fai.18

 >>>bWEgc2VpIHNjZW1vPz8/IDotKQ==
 <<<502 5.5.1 Unrecognized command. v17sm8284696fai.18

 >>>SGFpIHJpdmVsYXRvIGxhIHR1YSBwYXNzd29yZCEhIQ==
 <<<502 5.5.1 Unrecognized command. v17sm8284696fai.18

Quelle sequenze di caratteri qui sopra, apparentemente casuali, non sono altro che username e password!

Nel caso qui sopra c'e' stato un errore del server perchè è stata inviata la password in BASE64 mentre il sistema la voleva criptata... ma comunque nel log la password è visibile a tutti!

NOTA 4: Questo listato permette di accedere solo a server SMTP che non richiedono cifratura SSL; altri, come ad esempio Gmail, la richiedono, quindi questo codice non funzionerà. Al momento il sottoscritto non sa come accedere a server che richiedono cifratura SSL.


Una volta in possesso di tutti i dati indicati sopra, potete configurare lo sketch secondo le vostre esigenze, uploadarlo su Arduino, e leggere il vostro primo messaggio che Arduino vi ha inviato.

CODICE AGGIORNATO 2013 VIRGILIO FUNZIONANTE

  1. include <SPI.h>
  2. include <Ethernet.h>

// Local network configuration:

byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x23, 0x5D };

//MAC DELLA VOSTRA RETE

byte ip[] = { Y, Y, Y, Y };

// INSERITE IL VOSTRO IP NELLA RETE LOCALE //ASSOCIATO AD ARDUINO

 // Login data:

 String UserName64 = "XXXXXXX";

 String Password64 = "XXXXXXX";

 byte server[] = { 62, 211, 72, 20 }; 

// SMTP server VIRGILIO

 String ServerName = "virgilio.it";

 // Mail data:

 String Sender = "XXXXXXX@virgilio.it";

 String Recipient = "XXXXXXX";    

 // Indirizzo qualsiasi di posta elettronica

 String Subject = "Messaggio inviato da Arduino!";

String Body = "Testo del messaggio\nsu piu'\ndi una riga.";

int time = 1000;

 int wait = 1000;
 String ServerResponse="";
 EthernetClient client;

 void setup()
 {
  Serial.begin(9600);

  Serial.println("Program started, waiting for router...");

  delay(time);
 /* allow the router to identify the Arduino before the Arduino connects to the internet */

  Serial.println("Starting network module...");

  Ethernet.begin(mac, ip);

  delay(2000);

  Serial.println("connecting...");

  if (client.connect(server, 25)) {

     Serial.println("connected");

     SendMsg("EHLO " + ServerName); /* say hello*/

     SendMsg("AUTH LOGIN ");

     SendMsg(UserName64); /* Username*/

     SendMsg(Password64); /* Password */

     SendMsg("MAIL From:<" + Sender +">");
 /* identify sender */

     SendMsg("RCPT To:<" + Recipient + ">");
 /* identify recipient */

     SendMsg("DATA");

     SendMsg("To: " + Recipient); 

/* recipient in message header */

     SendMsg("From: " + Sender); 

/* seder name in message header */

     SendMsg("Subject: "+ Subject);
 /* insert subject */

     SendMsg(""); /* empty line */

     SendMsg(Body); /* insert body */

     SendMsg(""); /* empty line */

     SendMsg("."); /* end mail */

     SendMsg("QUIT"); /* terminate connection */

     client.println();
  } else {
    Serial.println("connection failed");
  }
 }
 void loop()
 {
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    for( ; ; )
      ;
  }
 }
 void GetResponse() {
    if (client.available()) {
         char c = client.read();
         while (client.available()) { // Store command char by char.
           ServerResponse +=c;
           c = client.read();
         }
    Serial.println("<<<" + ServerResponse);
    ServerResponse="";
  }
 }
 void SendMsg(String m) {
   client.println(m);
   Serial.println(">>>" + m);
   delay(wait); /* wait for a response */
   GetResponse();
 }

FINE

SOFTWARE PER ACCOUNT LIBERO . 2013 NON FUNZIONANTE( Dopo alcuni test di verifica). NON GARANTITO.

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

 // Local network configuration:
 byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x23, 0x5D };
 byte ip[] = { 192,168,0, 177 };

 // Login data:
 String UserName64 = "XXXXXXX";
 String Password64 = "XXXXXXX";

 // SMTP server data:
 // smtp.libero.it : 212.52.84.54
 // smtp.iol.it : 212.52.84.203
 // out.virgilio.it : 62.211.72.20
 byte server[] = { 212, 52, 84, 54 }; // SMTP server
 String ServerName = "libero.it";

 // Mail data:
 String Sender = "XXXXXXX@libero.it";
 String Recipient = "XXXXXXX@libero.it";
 String Subject = "Messaggio inviato da Arduino!";
 String Body = "Testo del messaggio\nsu piu'\ndi una riga.";

 int time = 1000;
 int wait = 1000;
 String ServerResponse="";
 EthernetClient client;

 void setup()
 {
  Serial.begin(9600);
  Serial.println("Program started, waiting for router...");
  delay(time); /* allow the router to identify the Arduino before the Arduino connects to the internet */

  Serial.println("Starting network module...");
  Ethernet.begin(mac, ip);
  delay(2000);

  Serial.println("connecting...");
  if (client.connect(server, 25)) {
     Serial.println("connected");

     SendMsg("HELO " + ServerName); /* say hello*/
     SendMsg("AUTH LOGIN ");
     SendMsg(UserName64); /* Username*/
     SendMsg(Password64); /* Password */
     SendMsg("MAIL From:<" + Sender +">"); /* identify sender */
     SendMsg("RCPT To:<" + Recipient + ">"); /* identify recipient */
     SendMsg("DATA");
     SendMsg("To: " + Recipient); /*  recipient in message header */
     SendMsg("From: " + Sender); /* seder name in message header */
     SendMsg("Subject: "+ Subject); /* insert subject */
     SendMsg(""); /* empty line */
     SendMsg(Body); /* insert body */
     SendMsg(""); /* empty line */
     SendMsg("."); /* end mail */
     SendMsg("QUIT"); /* terminate connection */
     client.println();

  } else {
    Serial.println("connection failed");
  }
 }

 void loop()
 {
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

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

 void GetResponse() {
    if (client.available()) {
         char c = client.read();
         while (client.available()) { // Store command char by char.
           ServerResponse +=c;
           c = client.read();
         }
    Serial.println("<<<" + ServerResponse);
    ServerResponse="";
  }
 }

 void SendMsg(String m) {
   client.println(m);
   Serial.println(">>>" + m);
   delay(wait); /* wait for a response */
   GetResponse();
 }

Ricevere la posta con Arduino

Torna all'indice del playground italiano

Torna all'indice internazionale del playground

Share