Páginas

martes, 9 de febrero de 2016

Emvio de eMail (SMTP)


  

 

 

 

 

Envio de eMail (SMTP)


Hoy os traigo un par de temas con los que estoy trabajando y que me parecen muy interesantes. Y es trabajar con nuestro Arduino mediante una red ethernet. Para esto tenemos que utilizar un shield ethernet, el más extendido y estandar es el W5100 Más información.


Hay varias formas de enviar mail con nuestro Arduino, hay componentes que nos hacen de intermediarios (como Temboo), mediante telnet a un PC que envie el mail o directamente mediante un servidor de correo smtp.

Esta última opción es la que a mi parecer es la más sencilla y limpia. Ya que sólo dependemos de nuestro Arduino para enviar el mail. Existen algunas restricciones para que podamos utilizar el servidor smtp directamente desde el Arduino, servicios de correo como Google o Yahoo no utilizan puertos estandar y además piden hacer conexiones seguras, algo complicadas para nuestro Arduino. Por lo tanto es necesario buscar un servidor de correo smtp que utilice el puerto estándar 25 sin seguridad. Tras buscar por la red me he decantado por una web de correo que está bastante bien y se ajusta a lo que necesitamos. Se trata de Mail India su datos del servidor smtp son servidor: smtp.india.com y puerto: 25

Sólo nos falta darnos de alta una cuenta y empezar a utilizarlo. Él código original es del PlayGround de Arduino: Código original yo lo he modificado un poco para hacerlo más utilizable.


  1. // Red W5100  
  2. #include "SPI.h"  
  3. #include "Ethernet.h"  
  4.   
  5. // Le asignamos los datos de Red Mac, IP y Puerto.  
  6. byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };  
  7. IPAddress ip( 192, 168, 0, 133 ); 
  8. IPAddress gateway( 192, 168, 0, 1 );
  9. IPAddress subnet( 255, 255, 255, 0 );

  10. // Servidor Mail (mail.india.com)  -> smtp puerto 25
  11. char server_smtp[] = "smtp.india.com";
  12. int port = 25;


Primero en nuestro código añadimos las librerías necesarias, configuramos la conexión a nuestra red, en este caso le damos la IP 192.168.0.133 al Arduino y por último ponemos los datos del servidor de correo.


  1. void setup()  
  2. {  
  3.   Serial.begin(9600);  
  4.   // Inicializamos la conexión Ethernet  
  5.   Ethernet.begin(mac, ip, gateway, gateway, subnet); 
  6.   delay(2000); 
  7. }  

En la función setup inicializamos la conexión para conectarnos a la red. De esta forma ya se conectaría el Arduino a nuestra red ethernet .



  1. byte enviaEmail(String email)
  2. {
  3.   
  4.   //LAN
  5.   String mi_ip    = "192.168.0.133";
  6.   String mi_mail  = "XXXXXX@india.com";

  7.   byte thisByte = 0;
  8.   byte respCode;
  9.   email = "RCPT To: <" + email + ">";
  10.   char mail_char[50];
  11.   email.toCharArray(mail_char,30);


  12.   Serial.print(F("Envio Mail ALRO: "));
  13.   Serial.println(email);
  14.  
  15.   if(client.connect(server_smtp,port) == 1) {
  16.     if (debug >= 2)
  17.       Serial.println(F("conectado servidor SMTP"));
  18.   } else {
  19.     if (debug >= 1)
  20.       Serial.println(F("conexion servidor SMTP Error"));
  21.     return 0;
  22.   }
  23.  
  24.   if(!eRcv_smtp()) return 0;

  25.   if (debug >= 2)
  26.     Serial.println(F("Enviando hola"));
  27.   client.print("EHLO ");
  28.   client.println(mi_ip);
  29.   if(!eRcv_smtp()) return 0;

  30.   if (debug >= 2)
  31.     Serial.println(F("Enviando autorizacion login"));
  32.   client.println("auth login");
  33.   if(!eRcv_smtp()) return 0;

  34.   if (debug >= 2)
  35.     Serial.println(F("Enviando Usuario"));
  36. // Cambiar codificado en Base64
  37.   client.println("VAaW43ft5kaWE0s2");
  38.   if(!eRcv_smtp()) return 0;

  39.   if (debug >= 2)
  40.     Serial.println(F("Enviando contraseña"));
  41. // Cambiar codificado en Base64
  42.   client.println("UGoeVTk3Mr58w==");
  43.  
  44.   if(!eRcv_smtp()) return 0;
  45.  
  46.   if (debug >= 2)
  47.     Serial.println(F("Enviando desde"));
  48.   
  49.   client.print("MAIL From: <");
  50.   client.print(mi_mail);
  51.   client.println(">");
  52.   if(!eRcv_smtp()) return 0;
  53.  
  54.   if (debug >= 2)
  55.     Serial.println(F("Enviando a"));
  56.   
  57.   
  58.   client.println(mail_char);
  59.   if(!eRcv_smtp()) return 0;
  60.  
  61.   if (debug >= 2)
  62.     Serial.println(F("Enviando Datos"));
  63.   client.println("DATA");
  64.   if(!eRcv_smtp()) return 0;
  65.  
  66.   if (debug >= 2)
  67.     Serial.println(F("Enviando email"));
  68.  
  69.   client.print("To: ALRO <");
  70.   client.print(email);
  71.   client.println(">");
  72.  
  73.   client.print("MAIL From: <");
  74.   client.print(mi_mail);
  75.   client.println(">");
  76.  
  77.   client.println("Subject: Arduino email test\r\n");
  78.  
  79.   client.println("El Arduino te mandan un mail de prueba."); 
  80.   client.println("Espero que te guste del blog arubia45.blogspot.com.es");
  81.  
  82.   client.println(".");
  83.  
  84.   if(!eRcv_smtp()) return 0;
  85.  
  86.   if (debug >= 2)
  87.     Serial.println(F("Enviando QUIT"));
  88.   client.println("QUIT");
  89.   if(!eRcv_smtp()) return 0;
  90.  
  91.   client.stop();
  92.  
  93.   if (debug >= 2)
  94.     Serial.println(F("desconectado"));
  95.  
  96.   return 1;
  97. }

Insertamos nuestro código, algo parecido a esto que os pongo (faltan algunas funciones que se llaman que lo puedes ver en el post original de Arduino PlayGround que pongo más arriba). El usuario y contraseña se ha de codificar en Base64 UTF-8, lo podéis hacer desde esta web: Encode Base64

  1. void loop() {  
  2.     enviaEmail("xxxx@gmail.com"))
  3. }

Espero que esta entrada os haya sido util y que os ayude a mejorar con nueva funcionalidad los desarrollos en Arduino.

2 comentarios:

  1. Hola buenas tardes.. te hago una consulta.. desde la pagina de india cuando quiero enviar un email me pide que tilde una casilla para saber que no soy un robot..
    esto puede generar que no me funcione el envio desde el arduino?? te consulto antes de configurar todo. desde ya muchas gracias

    ResponderEliminar
    Respuestas
    1. Hola, yo sigo utilizando este servicio sin novedad. Saludos

      Eliminar