Enviar mail desde Arduino

Hola, Este es mi primer post. Básicamente lo que estuve buscando por mucho tiempo es la manera de enviar mail desde Arduino. El problema de Arduino es que este no soporta los protocolos TSL/SSL, con lo podremos utilizar la mayoría de los servidores Smtp. Lo que encontré fue el servicio que da Smtp2go
Lo que tenemos que hacer es darnos de alta una cuenta ahi. Aca crearemos un nombre de usuario y contraseña. Este nombre de usuario no tiene porque ser la dirección de mail de la cual “enviariamos” el mail. Esto funcionaria asi…

  1. Nos logueamos en el servidor Smpt2go con el usr y pass que hayamos puesto
  2. Especificamos los datos del mail Remitente, Destinatario, Mensaje y Adjunto
  3. Se envia el mail

Esto enviara un mail al destinatario como si lo hubieramos enviado desde la casilla Remitente. Lo bueno de Smtp2go es que no utiliza TSL/SSL, con lo cual podemos enviar sin problemas mails como si fuera desde cualquier casilla. Hay que tener en cuenta que en codigo el nombre de usuario y contraseña tienen que estar codificados en Base64 UTF-8. La codificacion se saca de esta pagina https://www.base64encode.org/

Este es el codigo…

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

byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x59, 0x67 };  
IPAddress ip( 192, 168, 0, 140 );    
IPAddress gateway( 192, 168, 0, 50 );
IPAddress subnet( 255, 255, 255, 0 );


EthernetClient client;

void setup()
{
 Serial.begin(9600);
 pinMode(4,OUTPUT);
 digitalWrite(4,HIGH);
 Ethernet.begin(mac, ip, gateway, gateway, subnet);
 delay(2000);
 SD.begin(4);
 Serial.println(F("Ready. Press 'e' to send."));
}

void loop()
{
 byte inChar;

 inChar = Serial.read();

 if(inChar == 'e')
 {
     if(sendEmail("Hola que tal","MENSAJE DE DIEGO","destino@hotmail.com","22102017.CSV")) Serial.println(F("Envio ok"));
     else Serial.println(F("Envio Error"));
 }
}

byte sendEmail(String Mensaje, String Asunto, String MailTo, String Adjunto) {
 byte thisByte = 0;
 byte respCode;
 char tBuf[64]; 
 File myFile;

 if(client.connect("smtpcorp.com",2525) == 1) {
   Serial.println(F("Conectado!"));
 } else {
   Serial.println(F("No conectado!"));
   client.stop();
   return 0;
 };
 if(!eRcv()) {
   client.stop();
   return 0;
 };
 Serial.println(F("Enviando hello"));
// poner el ip del arduino
 client.println("EHLO 192.168.0.140");
 if(!eRcv()) {
   client.stop();
   return 0;
 };
 Serial.println(F("Enviando auth login"));
 client.println("auth login");
 if(!eRcv()) {
   client.stop();
   return 0;
 };
 Serial.println(F("Enviando Usuario")); 
// Cambiar por el nombre de usuario de la cuenta Smtp2go codificado en base64 https://www.base64encode.org/
 client.println("usuario codificado"); //Usuario Smtp2go
 if(!eRcv()) {
   client.stop();
   return 0;
 };
 Serial.println(F("Sending Password"));
// Cambiar por la clave de la cuenta Smtp2go codificado en base64 https://www.base64encode.org/
 client.println("clave codificada"); //Clave Smtp2go
 if(!eRcv()) {
   client.stop();
   return 0;
 };
// change to your email address (sender)
 Serial.println(F("Enviando direccion remitente(From)"));
 client.println("MAIL From: <remitente@hotmail.com>");
 if(!eRcv()) {
   client.stop();
   return 0;
 };
// change to recipient address
 Serial.println(F("Enviando direccion Destinatario(To)"));
 client.print("RCPT To: <");
 client.print(MailTo);
 client.println(">");
 if(!eRcv()) {
   client.stop();
   return 0;
 };
 Serial.println(F("Enviando DATA"));
 client.println("DATA");
 if(!eRcv()) {
   client.stop();
   return 0;
 };
 Serial.println(F("Enviando mail"));
//// Si quiero suplantar las direccion que van a aparecer en el mail...
//  client.println("To: Nombre <loquequiera@dominio.com>");
//  client.println("From: Nombre <loquequiera@dominio.com>");
 client.print("Subject: ");
 client.println(Asunto);
 if(Adjunto=="") {  //Sino tiene adjunto
   client.println(Mensaje);
 }
 else {  //Si tiene adjunto
   client.println("MIME-Version: 1.0");
   client.println("Content-Type: Multipart/mixed; boundary=frontier");
   client.println("");
   client.println("--frontier");
   client.println("Content-Type: text/plain");
   client.println("");
   client.println(Mensaje);
   client.println("--frontier");
 //Archivo Adjunto
   client.println("Content-Type: text/plain");
   client.print("Content-Disposition: attachment; filename="
   client.println(Adjunto);
   client.println("");
   int clientCount = 0;
  myFile = SD.open(Adjunto,FILE_READ);
   if(myFile) {
     while(myFile.available()) {
       clientCount = myFile.read(tBuf,64);
       client.write((byte*)tBuf,clientCount);
     };
   }
   else {
     Serial.println(F("Archivo no encontrado"));
   };
   client.println("--frontier--");
 };
 myFile.close();                    
 client.println("."); //Fin del mail
 client.println("QUIT");
 if(!eRcv()) {
   client.stop();
   return 0;
 };
 client.stop();
 Serial.println(F("desconectado"));
 return 1;
};

byte eRcv()
{
 byte respCode;
 byte thisByte;
 int loopCount = 0;

 while(!client.available()) {
   delay(1);
   loopCount++;

   // Sino recibe nada por 10seg, timeout
   if(loopCount > 10000) {
     client.stop();
     Serial.println(F("\r\nTimeout"));
     return 0;
   }
 }

 respCode = client.peek();

 while(client.available())
 {  
   thisByte = client.read();    
   Serial.write(thisByte);
 }

 if(respCode >= '4')
 {
   efail();
   return 0;  
 }

 return 1;
}


void efail()
{
 byte thisByte = 0;
 int loopCount = 0;

 client.println(F("QUIT"));

 while(!client.available()) {
   delay(1);
   loopCount++;

   // Sino recibe nada por 10seg, timeout
   if(loopCount > 10000) {
     client.stop();
     Serial.println(F("\r\nTimeout"));
     return;
   }
 }

 while(client.available())
 {  
   thisByte = client.read();    
   Serial.write(thisByte);
 }

 client.stop();

 Serial.println(F("desconectado"));
}

sketch_mar22a.ino (4.76 KB)

no funciona de hecho arroja un error en el código por la faltra de un parentesis.

Probé el código original del link: Arduino - SMTP2GO

Y tampoco funciona... alguna otra idea?

NO revivas hilos de mas de 120 dias.
Hilo cerrado