Librería para el envío de correo electrónico desde Arduino con un módulo Wifi ESP8266

publicado en: Portada | 23

En un contexto actual de primacía indiscutible de la mensajería instantánea para las comunicaciones entre personas, hemos abandonado en gran medida el uso del correo electrónico. Además, las modernas aplicaciones de mensajería instantánea, basadas en dispositivos móviles y asociadas al (número de) teléfono, nos han hecho perder una característica muy útil en las telecomunicaciones, la interoperabilidad. Ahora asumimos como habitual que, para comunicar con el usuario de una aplicación o plataforma, es necesario disponer también en nuestro terminal de esa aplicación o asociarnos a la correspondiente plataforma, cosa que no ocurre con el e-mail: sigue siendo una forma universal de comunicación que se puede explotar fácilmente desde Arduino.

Funcionamiento del protocolo de envío de correo electrónico SMTP

La estructura de envío y recepción de correo electrónico (MHS) está organizada según una arquitectura cliente-servidor. Un usuario que desee enviar un e-mail debe conectar con un servidor de correo saliente, concretamente al MSA, utilizando el protocolo SMTP. El MSA entrega al mensaje al MTA (mail relay) que a su vez actúa como cliente con otros servidores MTA (mail relay) hasta llegar a destino, donde el MDA lo entrega al (usuario) destinatario, que le solicita el correo utilizando el protocolo POP (actualmente POP3) o IMAP. Lo más frecuente es que en la actualidad el servidor de correo saliente incluya MSA y MTA.

Aunque es posible trabajar con cualquier puerto, el SMTP suele utilizar el 25 (el más común) o el 587. Dada su relevancia, los servidores de nombre de dominio (DNS) disponen de un registro (MX) reservado para indicar la dirección IP del servidor de recepción de correo de un dominio.

Una vez que el correo electrónico ha llegado al MDA, es el usuario destinatario (cliente) el que debe solicitar activamente el correo electrónico al servidor.

correo electrónico (e-mail) diagrama del proceso de envío y recepción

En general, las aplicaciones de correo electrónico (clientes como Outlook, Thunderbird, KMail, Geary…) suelen incluir clientes tanto para el envío como para la recepción y habitualmente son capaces de utilizar diferentes protocolos para conectar con el MDA. En el caso del ejemplo de este artículo interesa desarrollar una aplicación que comunique con el MSA (a esto efectos, el servidor de correo) utilizando el protocolo de transferencia simple de correo (SMTP).

Para explotar el SMTP desde Arduino con el módulo Wifi ESP8266, en la mayoría de los casos, es necesario autenficarse utilizando un nombre de usuario y una clave reconocidos por el servidor para que el correo electrónico se envíe. Por lo demás, será necesario indicar el remitente, el destinatario y el contenido del correo electrónico; estas operaciones se realizan dentro de una sesión acotada por los correspondientes códigos de inicio y fin.

EHLO Arranca la sesión. Se acompaña del nombre del dominio. Muestra las operaciones disponibles
AUTH LOGIN Inicia la autentificación. Espera el nombre de usuario y la clave codificados en Base64
MAIL FROM: Permite especificar el remitente en el formato: <correo@dominio.com>
RCPT TO: Indica el destinatario del correo electrónico en el mismo formato que el remitente
DATA Establece el modo de recepción del contenido del correo electrónico en el servidor
QUIT Finaliza la sesión de envío de correo electrónico

La mayoría de los servidores permiten omitir el saludo EHLO (que, por cierto, sustituye al anterior HELO). En las siguientes pruebas se usa más para ver la respuesta del servidor que por necesidad operativa. Para hacer las pruebas se puede utilizar una herramienta de TelNet sobre el servidor de correo electrónico, en el puerto correspondiente, como puede verse en la captura de pantalla de abajo.

Sesión telnet SMTP para enviar un correo electrónico desde Arduino con el módulo Wifi ESP8266

Para mayor claridad, en la imagen anterior se han resaltado las entradas del usuario, lo que permite distinguirlas de las respuestas del servidor. En primer lugar se realiza la conexión desde la consola con telnet añadiendo como primer parámetro el servidor SMTP y como segundo el puerto. Una vez conectado, EHLO (con parámetro el nombre del dominio) muestra las opciones disponibles. Para identificar al usuario se utiliza AUTH LOGIN que responderá primero con el texto VXNlcm5hbWU6 (que corresponde a Username: expresado en Base64) solicitando el nombre del usuario codificado en Base64 y luego con el texto UGFzc3dvcmQ6 (que corresponde a Password: expresado en Base64) pidiendo la clave, que también deberá estar codificada en Base64.

Si el inicio de la sesión ha sido correcto el servidor avisa con un mensaje de autentificación correcta y espera los datos que definen el correo electrónico. Como se decía más arriba, será necesario indicar MAIL FROM: seguido del remitente del correo electrónico (normalmente puede ser cualquiera del dominio, aunque no exista tal dirección). El destinatario del e-mail se indica como parámetro de RCPT TO:. Tanto para el destinatario como para el remitente, es imprescindible expresar la dirección en el formato <nombre@dominio.com>.

Para indicar el contenido del correo electrónico se utiliza DATA (sin parámetros). El servidor avisará de que queda esperando contenido hasta que se envíe una línea en blanco (CR+LF) y un punto en una línea sin más texto (es decir, volviendo a enviar CR+LF).

Además del propio contenido del texto, después de DATA se puede indicar otra información del correo electrónico, la cabecera. Especialmente útil es añadir un asunto iniciando el texto con Subject:. También es habitual repetir el remitente usando From: en la cabecera, el destinatario con To:, usuarios a los que enviar copia del e-mail usando CC: o copia oculta con BCC:.

Sesión telnet SMTP para enviar un e-mail con copia desde Arduino con el módulo Wifi ESP8266

Implementación del SMTP en Arduino con el módulo Wifi ESP8266

Aprovechando el método genérico de uso del ESP8266 que se explicó en el anterior artículo sobre las operaciones básicas para manejar un módulo wifi ESP8266 desde Arduino es posible desarrollar fácilmente un programa para Arduino que envíe un correo electrónico de aviso.

Supongamos que tenemos un sensor de temperatura conectado a una entrada analógica de una placa Arduino que leemos con un código como el siguiente:

El código anterior mide la temperatura cada cierto intervalo INTERVALO_LECTURA_TEMPERATURA y calcula la temperatura media. Si esta temperatura media, después de realizar cierta cantidad de medidas CANTIDAD_TEMPERATURAS_PROMEDIADAS (que define un intervalo mayor), es superior a un máximo establecido TEMPERATURA_MAXIMA se activa un aviso de error (se enciende un LED, en el ejemplo) o se activa un indicador de funcionamiento correcto.

Para tener constancia en remoto del aviso de error se puede implementar el envío de un correo electrónico con el método para ejecutar una operación compleja en el módulo wifi ESP8266 definida por varias órdenes AT modificando las operaciones de envío de cantidad y de transmisión de datos para que vayan tomando los valores que cada paso del protocolo necesita. Como el método genérico ya se explicó con detalle, ahora merece la pena aclarar solo las modificaciones que permiten utilizarlo para enviar correo electrónico.

El último bloque de asignación de vectores muestra una de las diferencias con la implementación genérica del envío de una operación compleja al ESP8266 definida por varias órdenes AT, se trata de la repetición del paso de envío de datos y del correspondiente aviso de la longitud del paquete enviado.

El método usado para realizar varios envíos sucesivos consiste en almacenar en un nuevo vector envio los datos transmitidos en cada paso de los que forman el total del envío y en otro vector respuesta los datos que esperan recibir de vuelta desde el módulo wifi ESP8266

La línea 117 define el cuerpo del correo electrónico. La primera línea (hasta llegar a \r\n) contiene una cabecera con el asunto y el resto es contenido neto. Como puede verse, este contenido se ha separado en dos líneas para recordar que es aconsejable (según RFC 2045) dividir el cuerpo de forma que las líneas no superen los 76 caracteres.

La línea 118 muestra una alternativa a la cabecera en la que el asunto contiene caracteres UTF-8 para lo que se entrega al servidor codificado en Base64 encerrado entre el indicador de inicio =?utf-8?B? y el de terminación ?=. Para avisar de que el contenido neto también es UTF-8 se utiliza la cabecera Content-Type: text/plain; charset=utf-8 en la linea siguiente al asunto. Trabajar con UTF-8 se utiliza la cabecera Content-Type: text/plain; charset=utf-8 permite usar caracteres que no están en el repertorio ASCII, como las letras con tilde o las eñes, pero ocupará más memoria y requerirá más tiempo de MCU al necesitar utilizar la codificación Base64.

En lugar de terminar (dejar de enviar datos) al procesar la última operación como en la implementación genérica del envío de una operación compleja al ESP8266 definida por varias órdenes AT, para terminar esta implementación se espera a llegar a la última operación (ENVIAR_DATOS) y al último envío (SALIR).

Al iniciar a la operación de envío del correo electrónico (operacion_actual==CONECTAR_SERVIDOR) y después de enviar cada paquete de datos (operacion_actual==ENVIAR_DATOS).

En condiciones normales el envío se realiza de forma muy rápida (especialmente si no se abusa de la longitud del mismo) por lo que se bloquea en envío de un correo electrónico usando la variable booleana grabando_datos mientras haya otro en curso. Cuando sea necesario procesar todos los avisos será necesario implementar un buffer que los almacene y los procese según vayan terminando los anteriores en lugar de bloquear su generación.

Librería para e-mail desde Arduino con el módulo Wifi ESP8266

Además de la (posible) necesidad de procesar el cuerpo del correo electrónico, el código anterior necesitará modificarse en cada aplicación para poder ser utilizado en el envío de e-mail ante circunstancias diferentes al aviso de la detección de un error que motiva el del ejemplo. Para hacerlo de manera genérica y que sea fácil reutilizar en otros proyectos, se desarrolla una librería para Arduino basada en el mismo método.

Generalizar la asignación de las órdenes AT

Aunque funcional, el programa del ejemplo anterior asigna cada orden AT del módulo wifi ESP8266 de manera individual. Para las órdenes estáticas (reiniciar, desconectar, configurar…) no es problema, pero para las órdenes que utilizan parámetros es conveniente utilizar un mismo método. Para la librería, el método elegido consiste en asignar memoria con malloc para la operación y formatearla con snprintf para componer el texto de la orden AT con los argumentos correspondientes.

Asignar los componentes codificados en Base64

Tanto el nombre de usuario como la clave se suelen ofuscar en la mayoría de servidores SMTP utilizando la codificación Base64. Como se entiende que estos parámetros (usuario y clave en el servidor) no cambiarán a lo largo del uso del objeto, se asignan directamente codificados (pese al requerimiento extra de memoria) en lugar de almacenar los originales y codificar a cada envío.

En el siguiente código se utiliza la librería para codificar con Arduino en Base64. En un anterior artículo se explica su funcionamiento pero es importante recordar dos cuestiones que pueden confundir si es la primera vez que se trabaja con ella. En primer lugar, está pensada para ir codificando según se recibe la información, no para esperar toda la información, que requeriría usar más memoria de la recomendable en un MCU y luego codificarla. La segunda cuestión es el terminador; en lugar de esperar el final de cadena estándar de C (\0), permite que se especifique cualquiera (lo que permitiría codificar datos genéricos, no solo texto, con el mismo algoritmo) así que habrá que avisar «a mano» del final del texto.

Trabajar con la codificación UTF-8 en el correo electrónico

Al hablar de la cabecera del e-mail ya se ha explicado que se puede usar la codificación UTF-8 para enviar los caracteres que no sean ASCII. Para hacerlo, ya se ha dicho, en la cabecera se indica el asunto codificado en Base64, precedido por =?utf-8?B? y seguido de ?= y se especifica el tipo de contenido con Content-Type: text/plain; charset=utf-8.

No es necesario especificar nada especial en el código Arduino para que las cadenas de texto que incluyan codificación UTF-8 se gestionen correctamente, pero es interesante recordar que los caracteres que no estén incluidos en el repertorio ASCII ocuparán más, lo que puede ser un dato para determinar si se decide usarlos o no.

Representación del carácter D en UTF-8 con un byte
Un carácter (como la letra D) ocupará solamente un byte por ser parte del repertorio ASCII

Representación de caracteres de dos bytes en UTF-8
Los caracteres que no sean del repertorio ASII ocuparán, al menos, dos bytes

Aunque los caracteres «especiales» se mostrarán en su contexto como un único símbolo, hay que subrayar que ocuparán más de un byte. La mayoría de caracteres (no-ASCII) usará dos bytes, pero algunos, como el signo € que representa el Euro, por ejemplo, necesitarán tres bytes. Cuando se modifique la longitud del contenido por la configuración de memoria que corresponda (frecuentemente heredadas de la configuración visual), el siguiente apartado del artículo es un buen ejemplo, se atenderá al número de bytes necesarios para representar cada símbolo y no al número de símbolos.

Partir el cuerpo del correo electrónico en líneas de 76 caracteres

Para cumplir con la especificación de RFC 2045 y para mostrar un ejemplo de cómo se podría procesar el contenido del correo, la librería implementa un método para dividir el cuerpo del e-mail en líneas de 76 caracteres como máximo (sin contar el fin de línea). Aunque no sería problema partir las palabras (la mayoría de los clientes de correo las reconstruyen) el método implementado busca los espacios más cercanos al fin de línea tratando de que el resultado sea también cómodamente legible para un humano.

Para integrar el nuevo método en el proceso de envío de operaciones al ESP8266 el último parámetro permite indicar si se añade o se omite el código de fin de línea. Cuando deba incluirse el final de línea, por economía, se añadirá solamente el código LF (\n) y no CR (\r) aunque se respetará si existe.

Dividir las líneas del cuerpo del correo electrónico para la librería Arduino de email con ESP8266

Agrupar variables booleanas

Trabajando con microcontroladores hay razones muy buenas para agrupar la función de varias variables booleanas en una variable entera de la longitud correspondiente (frecuentemente un byte o el ancho de un registro de memoria). Una de ellas, ya la hemos mencionado alguna vez, es ahorrar un poco de memoria, ya que una variable booleana necesitará más que el bit que utiliza para almacenar el valor lógico.

Otra razón que lleva a agrupar varias variables booleanas es la legibilidad de juntar en un único valor los componentes que determinan una circunstancia compleja. En el código de ejemplo de la implementación del SMTP ya se hacía con la configuración de cada operación para establecer si la operación necesitaba recibir un mensaje para y los mensajes que avisaban de que había terminado.

No está de más recordar que la asignación positiva individual se realiza con una operación OR como estado|=valor, lo que permite preservar los valores (bits) que no se modifican y la negativa con una operación XOR como estado^=valor. Esto permite tener una constante (o una macro) que representa el bit que se modifica y que recuerda su función, igual que haría una variable booleana, por su nombre. La expresión lógica, para comparar, utiliza el formato estado&valor, un poco más largo que la versión booleana pero igualmente legible e intuitivo.

Disminuir el nivel de anidamiento y empaquetar tareas en funciones

Ciertamente, cuanto mayor es el nivel de anidamiento más difícil es seguir el funcionamiento del código y por tanto más difícil es mantener un programa. La alternativa es separar bloques de código, con una finalidad bien definida, en funciones. El problema es que, en sistemas con pocos recursos, como los MCU, hay que ser cuidadosos y tratar de no abusar de las llamadas (anidadas) a funciones para no colapsar la memoria dinámica del microcontrolador.

Las filosofías más rigurosas sobre buenas prácticas de programación recomiendan simplificar al máximo el nivel de anidamiento y su contenido. Sin duda, el código escrito así será muy fácil de mantener pero puede que no sea tan económico en recursos como el trabajo con las series más pequeñas de MCU requieren. Es una consideración subjetiva, pero se suele admitir que el código con más de tres niveles de anidamiento de bloques de control es difícil de mantener y el código anterior tiene el triple, así que hay una buena razón para probar alternativas.

Otra buena razón para el uso de funciones (objetos, métodos…), además de porque hacen más fácil de mantener el código, es para encerrar en ellas una lógica independiente (lo más genérica posible) que se podrá aprovechar en diferentes proyectos. En este caso, esa misión se cumple a medias, ya que una buena parte del código es específico, por lo que aparecerán muchos componentes globales (a nivel de objeto) cosa que, con carácter general, no muy ortodoxa al diseñar funciones.

Utilizar la librería para enviar correo electrónico desde el ESP8266

Para enviar un e-mail con la librería para correo electrónico desde Arduino con el módulo wifi ESP8266 basta con ① inicializar el objeto con los datos base del correo electrónico, ② asignar los parámetros del correo, ③ iniciarlo y ④ procesar el envío y la recepción hasta que las operaciones hayan terminado.

Al crear el objeto se asignan los datos que (normalmente) son estables a lo largo de todos los envíos: ① SSID del punto de acceso al que se conecta el ESP8266, ② clave del punto de acceso ③ servidor de correo electrónico, ④ nombre del usuario de la cuenta de correo electrónico que se utiliza para enviar, ⑤ clave de la cuenta de correo electrónico y ⑥ remitente. Normalmente, el remitente debe ser el de la cuenta pero la mayoría de los servidores son flexibles con este parámetro siempre que el dominio del remitente corresponda con el de la cuenta de correo electrónico.

El resto de los datos se asignan con los métodos asignar_destinatario, asignar_asunto y asignar_cuerpo, que esperan el parámetro correspondiente (que sugiere su nombre). Los datos de conexión al punto de acceso y del servidor de SMTP se pueden reasignar con los métodos: asignar_wifi, asignar_servidor, asignar_usuario, asignar_clave y asignar_remitente, aunque seguramente no sea necesario modificarlos y bastará con la asignación que se realiza cuando se crea el objeto.

Para poder usar la librería en las diferentes placas Arduino debe asignarse «manualmente» SERIE e inicializarse a la velocidad que tenga configurada el módulo wifi ESP8266 que se vaya a utilizar.

Si te ha gustado, puedes descargar la librería para correo electrónico desde Arduino con el módulo wifi ESP8266 y escribir algún comentario explicando los proyectos en los que la usas. ¡También son bienvenidas sugerencias y mejoras!

Víctor Ventura

Desarrollando aplicaciones para la web conocí el potencial de internet de las cosas, encontré la excusa perfecta para satisfacer la inquietud de aprender electrónica que había tenido desde siempre. Ahora puedo darme el gusto de programar las cosas que yo mismo diseño y fabrico.

Más entradas - Página web

Sígueme:
TwitterLinkedIn

Seguir Víctor Ventura:

Programador multimedia y web + IoT. Mejor con software libre.

Desarrollando aplicaciones para la web conocí el potencial de internet de las cosas, encontré la excusa perfecta para satisfacer la inquietud de aprender electrónica que había tenido desde siempre. Ahora puedo darme el gusto de programar las cosas que yo mismo diseño y fabrico.

23 Respuestas

  1. AGG

    Ayuda!! No consigo hacer funcionar la librería. He revisado las claves y toda la configuración pero no manda el email

    • Víctor Ventura

      Pues así, sin más datos, no sé decirte qué puede ser 🙁

      Lo que yo haría, lo recomiendo en el artículo, es empezar por hacer una sesión TelNet conectando el módulo wifi ESP8266 a un PC por el puerto serie. De esta forma puedes analizar el comportamiento del servidor ante las diferentes operaciones. También es bueno grabar la sesión para consultarla más adelante.

      Una vez que has conseguido que funcione de esta manera (con TelNet), puedes monitorizar las comunicaciones con un sniffer del puerto serie como explico en el artículo sobre las operaciones básicas sobre un módulo wifi ESP8266 desde Arduino. Si no tienes un sniffer (y no quieres fabricártelo) puedes conectar TX del ESP8266 o TX de la placa Arduino a RX de un conversor UART TTL a USB y usar un programa (como PuTTY o CuteCom) que muestre lo que está enviando o recibiendo (según hayas conectado TX o RX).

      Espero que esto te ayude un poco. Gracias por participar en polaridad.es

      • AGG

        Ya funciona, gracias. Era cosa mía, estaba confundiendo la dirección de email con el nombre de usuario

    • Javier Fernandez

      a mi tampoco me funciona y cuando empiezo la configuración del correo se congela el programa y lo noto por que el led sensor que uso ya no se enciende.

      • Víctor Ventura

        Pues eso de que el LED del módulo del sensor no se encienda es una pista. Solamente por intuición, no nos das muchos datos, se me ocurre que el programa consume toda la memoria dinámica y colapsa al juntarse con la pila. Para asegurarte de que el problema es el que describo, puedes probar a reducir (mucho) la longitud de los textos o, mejor, ejecutar el programa en un MCU con más memoria (suponiendo que tengas uno disponible). Si esto te permite verificar que el problema es de memoria, puedes tratar de optimizarla usando memoria de programa con F(), leyendo de la EEPROM

        Por favor cuéntanos si eso te ha ayudado.
        ¡Gracias por participar en polaridad.es!

  2. R Romera

    Hola Victor.
    En el artículo sobre base-64 te preguntaba porque no se calcula con todo el texto y la razón era que podía llegar poco a poco.
    En el asunto del correo se conoce entero ¿no sería mejor ahora calcularlo entero?
    Gracias.

    • Víctor Ventura

      Hola otra vez.

      Tienes razón: en este caso, por el uso que se hace (codificar el nombre de usuario, la clave y el asunto del correo electrónico) sería mejor codificar el original completo. En realidad no quería complicar mucho (más) las cosas en este artículo con ese tema y simplemente usar la librería para codificar en Base64 y remitir al artículo original a los lectores.

      Si no te importa, voy a pasar tu comentario al artículo sobre la codificación Base64 y ahí te respondo. Te ha tocado que edite todas tus entradas 😀

      Otra vez gracias por participar en polaridad.es

  3. nadie

    Hay dos cosas que nos han explicado en clase diferente de lo que usted hace y me gustaría saber la razón.
    La primera es que las librerías se cargan con #include <lib.h> y no con #include «lib.h» y la segunda es que las propiedades no deben estar expuestas y hay que ver su valor con getPropiedad y cambiarlo con setPropiedad
    Gracias.

    • Víctor Ventura

      Hola, Nadie 😀

      Creo que, a grandes rasgos, yo te hubiera explicado lo mismo; pero los detalles y el contexto son importantes.

      Las librerías que se cargan de la ubicación por defecto (la carpeta «libraries», normalmente) se incluyen indicando su nombre entre < y > y las que se cargan de una ubicación específica (la del proyecto, frecuentemente) se entrecomillan. Es algo de C o C++, no de Arduino. La razón por las que verás que uso más veces las comillas que los signos < y > es porque soy muy humilde 🙂 y no aspiro a que tomes mis librerías como algo definitivo y las «instales» pero sí que pueden ser útiles en un proyecto y siempre podrías grabarlas en su carpeta e incluirlas indicando el nombre entre comillas. Por supuesto, si quieres, puedes grabarlas en la carpeta correspondiente y cargarlas con #include <libreria.h> (ojo que en este artículo se usan dos)

      Los «getters» y los «setters» sí que están en mis librerías (incluyendo esta) pero no con un nombre como setAlgo, más bien (por ejemplo) con un nombre como cambiar_algo. Lo hago así porque el objetivo del blog no es aportar librerías sino explicar cómo las he hecho o cómo funcionan. Creo que para los lectores, que seguramente estén aprendiendo electrónica o programación (o ambas cosas), les puede resultar más fácil con esa nomenclatura aunque, por supuesto, si al trabajar en equipo se decide nombrarlas como te han propuesto en clase (que es muy habitual, casi «la estándar») una vez que está claro el funcionamiento no creo que haya problema en usar esa nomenclatura. Hay otros detalles de estilo que seguro habrás visto de otra forma, por ejemplo, es más frecuente abrir la llave del bloque { en la misma línea y yo suelo usar la siguiente para marcar más el bloque.

      Gracias por participar en polaridad.es

  4. Manuel

    Hola me gustaría saber si hay alguna forma de poder guardar los datos de lectura de los GPIO en una memoria en el modulo esp8266-01
    O bien en el modulo esp8266-13E
    Es para cuando se desconecta la corriente del modulo, y cuando vuelva la corriente, la salida siga estando en la misma posición on u off.
    Muchas gracias

  5. ISmael

    Hola, nosotros queremos hacer un proyecto para la universidad y una de las cosas que haría nuestro arduino UNO, es si insertan 3 veces una contraseña incorrecta, enviar un email al propietario indicando ue están intentando entrar en su dispositivo.

    Con esta librería nos funcionaria? O solo sirve para el caso de la temperatura?

    Saludos, gracias!

      • Ismael

        Hola Víctor,

        Gracias por tu contestación, hemos cambiado de la librería la velocidad a 9600 ya que el nuestro funciona a esa y en el código también.

        Tenemos que entregar el proyecto hoy por la noche y sin esto no podemos hacerlo.

        Lo hemos conectado a Internet y funciona, pero al aplicar tu código para enviar el email mira lo que nos sale: https://gyazo.com/0f376628efaf36ad3a793bec89b4a1ad

        Solo sale eso en la consola, yo creo que hemos puesto bien los datos.

        Que puede pasar? Como lo solucionamos? Gracias!

        • Víctor Ventura

          Hola, Ismael.

          En la captura de pantalla lo que veo es una advertencia, no un error, por la forma en la que conviertes las cadenas.

          ¿Has probado a mandar un correo electrónico sin más lógica (sin depender de la temperatura o lo que sea) para ver si funciona? Podría ser que el problema no esté relacionado con la librería.

          En tu correo anterior dices que usas un Arduino Uno. He visto que trabajas con cadenas de texto muy largas ¿Puede ser que te estés quedando sin memoria en tiempo de ejecución? A algún usuario ya le ha pasado (revisa los comentarios anteriores) ¿Puedes probar en una placa con un MCU con más memoria (como un Arduino Mega)? Si en un microcontrolador con más memoria funcionara podrías descartar que el problema fuera el código.

          ¡Saludos y ánimo con el proyecto. A ver si con un poco de suerte lo entregáis a tiempo!

          • Ismael

            Como puedo hacer la prueba de enviar un correo sin depender de la temperatura? Realmente yo tendría que decirle cuando enviarla, sin depender de la temperatura.

            Gracias, saludos!

          • Víctor Ventura

            Hola, Ismael.

            Voy a tratar de explicarme mejor 🙂

            Ya sé que quieres que el programa mande un correo, pero yo ahora lo que trato es de encontrar el error.

            La hipótesis de partida (por lo poco que sé de tu proyecto) es que no te cabe en la memoria (por el tipo de placa que estás usando y por los textos tan largos que he visto)

            La prueba más sencilla que puedes hacer para confirmarlo es usar una placa con un MCU con más memoria (como un Arduino Mega) Si no puedes conseguir una, la siguiente prueba es usar la librería con el texto más breve posible.

            Una vez confirmado que el error es ese, puedes cambiar la placa del proyecto (quiero decir «podrías») o tratar de aligerar el programa.

            Si con un MCU con más memoria sigue sin mandar el correo, entonces revisaría el proyecto para buscar otra hipótesis con la que rastrear el error.

            ¡Suerte con el proyecto!

    • Víctor Ventura

      ¡Hola!

      No es muy diferente (en concepto) Hay que conectar al servidor IMAP o POP (el/los que ofrezca el servidor) solicitar una lista de correos para ver qué hay nuevo y pedir que envíe el que se desea leer.

      A lo mejor me animo a escribir un artículo sobre el tema. Puede que resulte interesante para los lectores.

      La mayoría de la gente que se interesa por la lectura de correo electrónico piensa que al «cliente» (un ESP8266, por ejemplo) le va a llegar una especie de aviso pero precisamente es «cliente», es decir, tiene que tomar la iniciativa de conectar con el servidor (al que sí le ha llegado el correo) para pedir que lo envíe.

      Saludos.

  6. chiclin

    !!!AYUDAAAA!!!!!!!!!!!!!!!!!!!!!!!!! tengo una pregunta como puedo mostrar los resultados en forma de una gráfica y comprarlo??

  7. Rafael

    Buenos días,

    «Sabes como hacer que el modulo en lugar de enviar un correo lo reciba?»

    Estamos tratando de convertir un correo electrónico a una determinada cuenta de correo en un señal que el Arduino Uno lo convierta un señal que active un relé (activar sirena acústico-luminosa).
    Tenia la idea hacer a través de SMS pero creo que pero será mas consistente con email, creo.
    Saludos y gracias por adelantado

  8. Rafael

    Hola !
    En vez de enviar me interesaría recibir email. ¿Se podría consultar un correo recibido para realizar una acción según el Asunto del correo?

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *