elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Recibir email y enviar al puerto serie
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Recibir email y enviar al puerto serie  (Leído 3,362 veces)
Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
Recibir email y enviar al puerto serie
« en: 9 Febrero 2023, 19:16 pm »

Hola:

Tengo desde hace tiempo un código que no uso desde el 2017, ahora en pleno 2023 vuelvo a retomar.

Se trata de recibir email los comandos necesarios para luego almacenarlo en una variable y esta lo envía al puerto serie.

Por ejemplo, en el asunto pongo Luz_ON, no hace falta el cuerpo escribir nada, lo lee el programa hecho en C# modo consola y luego envía esa información a puerto serie, tal cual.

El problema es cuando recibe comandos como Luz_ON y Luz_OFF, al enviarlo al puerto serie, me da que no envia nada aunque diga que si.

Aquí está la librería que suso del POP para recibir datos.

https://github.com/foens/hpop

Aquí abajo el código mal optimizado y mal hecho el diseño, al menos por ahora hasta que me funcione como Dios manda.

¿Se puede saber en que falla?

Código
  1. using System;
  2. using System.Collections.Generic;
  3. using OpenPop.Pop3;
  4. using OpenPop.Mime;
  5. using System.Text.RegularExpressions;
  6. using System.IO.Ports;
  7. using System.Text;
  8. using System.Timers;
  9. using System.Threading;
  10.  
  11. namespace Recibir_email_enviar_arduino_Consola_03
  12. {
  13.    class Program
  14.    {
  15.        // Disparador de eventos del timer. Dispara cada cierto tiempo por el timer.
  16.        public static void DisparadorEventosTimer(object source, ElapsedEventArgs e)
  17.        {
  18.            //ConsoleKey tecla;
  19.            string comando = "";
  20.  
  21.            ConnectPop3 oC = new ConnectPop3();
  22.  
  23.            List<OpenPop.Mime.Message> lstMessages = oC.GetMessages();
  24.  
  25.  
  26.            if (lstMessages != null)
  27.            {
  28.  
  29.                foreach (var oMessage in lstMessages)
  30.                {
  31.                    Console.Clear(); // Limpiar pantalla.
  32.                    Console.SetCursorPosition(0, 0);
  33.                    Console.ForegroundColor = ConsoleColor.White;
  34.                    Console.WriteLine("EMAIL DE: ");
  35.                    Console.ForegroundColor = ConsoleColor.Gray;
  36.  
  37.                    string emailDesde = oMessage.Headers.From.ToString();
  38.  
  39.                    // Expresión regular detectar dirección email.
  40.                    Regex rx = new Regex(@"<(.*?)>");
  41.                    //Regex rx = new Regex(@"^([da-z_.-]+)@([da-z.-]+).([a-z.]{2,6})$");
  42.                    // Guarda la dirección email en la variable "emailCompleto".
  43.                    string emailCompleto = rx.Match(emailDesde).Groups[1].Value;
  44.                    // Muestra solo la dirección del email.
  45.                    Console.WriteLine(emailCompleto);
  46.  
  47.                    // ¿Son email filtrados? Sí, ejecuta las intrucciones necesarios para leer asunto y mensajes.
  48.                    if ((emailCompleto == "metaconta@gmail.com") ||
  49.                        (emailCompleto == "celltium@gmail.com") ||
  50.                        (emailCompleto == "metaconta@hotmail.com"))
  51.                    {
  52.                        Console.WriteLine("{0} a pasado el filtro: ", emailCompleto);
  53.  
  54.                        Console.ForegroundColor = ConsoleColor.White;
  55.                        Console.WriteLine();
  56.                        Console.WriteLine("ASUNTO: ");
  57.                        Console.ForegroundColor = ConsoleColor.Gray;
  58.                        Console.WriteLine(oMessage.Headers.Subject + "\n"); // Asunto.
  59.                        comando = oMessage.Headers.Subject; // Guarda el asunto en la variable "comando".
  60.                        Console.ForegroundColor = ConsoleColor.White;
  61.                        Console.WriteLine();
  62.                        Console.WriteLine("MENSAJE: ");
  63.                        Console.ForegroundColor = ConsoleColor.Gray;
  64.                        Console.WriteLine();
  65.  
  66.                        // ¿Es texto sin formato? Sí.
  67.                        // if (oMessage.MessagePart.IsText == true)
  68.                        if (oMessage.MessagePart.IsText)
  69.                        {
  70.                            Console.WriteLine("Texto sin formato.");
  71.                            Console.WriteLine(oMessage.MessagePart.GetBodyAsText());
  72.                            Console.WriteLine("-------------------------------------------");
  73.                        }
  74.                        // No. Texto con formato.
  75.                        else
  76.                        {
  77.                            Console.WriteLine("Texto con formato.");
  78.  
  79.                            // Encuentra el primer texto sin formato.
  80.                            MessagePart plainTextPart = oMessage.FindFirstPlainTextVersion();
  81.                            if (plainTextPart != null)
  82.                            {
  83.                                // El mensaje tenía una versión de texto sin formato.
  84.                                Console.WriteLine(plainTextPart.GetBodyAsText());
  85.                            }
  86.                            else
  87.                            {
  88.                                // Trate de encontrar un cuerpo para mostrar en algunas de las otras versiones de texto.
  89.                                List<MessagePart> textVersions = oMessage.FindAllTextVersions();
  90.                                if (textVersions.Count >= 1)
  91.                                {
  92.                                    Console.WriteLine(textVersions[0].GetBodyAsText());
  93.                                }
  94.                                else
  95.                                {
  96.                                    Console.WriteLine("<<OpenPop>> Cannot find a text version body in this message to show <<OpenPop>>");
  97.                                }
  98.                            }
  99.                        }
  100.                    }
  101.  
  102.                    // No. Entonces,ignorará los email no filtrados.
  103.                    else
  104.                    {
  105.                        Console.WriteLine("No ha pasado el filtro y no se leerá ningún email.");
  106.                    }
  107.                }
  108.            }
  109.            Console.ForegroundColor = ConsoleColor.Yellow; // Letras amarillas.
  110.            Console.WriteLine();
  111.            //Console.WriteLine("FIN DEL PROGRAMA.");
  112.            //Console.ReadKey(); // Pulse cualquier tecla para salir.
  113.            Console.ForegroundColor = ConsoleColor.Gray;
  114.  
  115.            // Cree un nuevo objeto SerialPort con la configuración predeterminada.
  116.            SerialPort Puerto_serie = new SerialPort("COM6")
  117.            {
  118.                BaudRate = 115200,
  119.                Parity = Parity.None,
  120.                StopBits = StopBits.One,
  121.                DataBits = 8,
  122.                Handshake = Handshake.None,
  123.                RtsEnable = true,
  124.  
  125.                // Establecer los tiempos de espera de lectura / escritura.
  126.                ReadTimeout = 500, // Milisegundos.
  127.                WriteTimeout = 500
  128.            };
  129.  
  130.            // Detecta cualquier dato recibido.
  131.            Puerto_serie.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
  132.  
  133.            Puerto_serie.Open(); // Abrir puerto.
  134.  
  135.            // ConsoleKey tecla;
  136.            // Console.WriteLine("Pulse tecla 1 para encender y 2 para apagar:");
  137.  
  138.            do
  139.            {
  140.  
  141.                switch (comando)
  142.                {
  143.                    case "Luz_ON":
  144.                        EncenderLuz();
  145.                        Thread.Sleep(100);
  146.                        break;
  147.  
  148.                    case "Luz_OFF":
  149.                        ApagarLuz();
  150.                        Thread.Sleep(100);
  151.                        break;
  152.  
  153.                    case "Salir":
  154.                        Environment.Exit(1); // Salir de la consola.
  155.                        break;
  156.  
  157.                    default:
  158.                        Console.WriteLine("Esperando comandos válidos");
  159.                        break;
  160.                }
  161.  
  162.                //tecla = Console.ReadKey(true).Key; // Espera pulsación de teclas.
  163.  
  164.  
  165.  
  166.                //switch (tecla)
  167.                //{
  168.                //    case ConsoleKey.D1: // Tecla 1 del teclado estandar.
  169.                //    case ConsoleKey.NumPad1: // Tecla 1 del número del pad.
  170.                //        EncenderLuz();
  171.                //        break;
  172.  
  173.                //    case ConsoleKey.D2:
  174.                //    case ConsoleKey.NumPad2:
  175.                //        ApagarLuz();
  176.                //        break;
  177.  
  178.                //    default:
  179.                //        Console.WriteLine("Tecla el 1, el 2 y Escape para salir.");
  180.                //        break;
  181.                //}
  182.  
  183.                Puerto_serie.Close(); // Cerrar puerto.
  184.  
  185.            } while (comando == "salir"); // while (tecla != ConsoleKey.Escape); // Pulsa Escape para salir del menú.
  186.  
  187.            void EncenderLuz()
  188.            {
  189.                byte[] miBuffer1 = Encoding.ASCII.GetBytes("Luz_ON"); // Codificación ASCII y guarda en la variable array tipo byte.
  190.                Puerto_serie.Write(miBuffer1, 0, miBuffer1.Length); // Envía los datos del buffer todo su contenido.
  191.                Console.WriteLine("Comando \"Luz_ON\" enviado."); // Muestra en pantalla comandos enviado.
  192.            }
  193.  
  194.            void ApagarLuz()
  195.            {
  196.                byte[] miBuffer2 = Encoding.ASCII.GetBytes("Luz_OFF");
  197.                Puerto_serie.Write(miBuffer2, 0, miBuffer2.Length);
  198.                Console.WriteLine("Comando \"Luz_OFF\" enviado.");
  199.  
  200.            }
  201.  
  202.            //Console.WriteLine("Presione cualquier tecla para terminar...");
  203.            Console.WriteLine();
  204.            Console.ReadKey(); // Espera pulsar una tecla cualquiera.
  205.            Puerto_serie.Close(); // Cierra el puerto serie.
  206.        }
  207.  
  208.        static void Main(string[] args)
  209.        {
  210.            // Título de la ventana.
  211.            Console.Title = "Recibir e-mail con Consola C# y enviar al LCD de Arduino";
  212.  
  213.            // Tamaño ventana consola.
  214.            Console.WindowWidth = 80; // X. Ancho.
  215.            Console.WindowHeight = 40; // Y. Alto.
  216.  
  217.            // Cursor invisible.
  218.            Console.CursorVisible = false;
  219.  
  220.            // Título del programa.
  221.            Console.WriteLine("\t-----------------------------------------------------");
  222.            Console.WriteLine("\tRecibir Correo Electrónico y enviar al LCD de Arduino");
  223.            Console.WriteLine("\t-----------------------------------------------------");
  224.            Console.WriteLine();
  225.  
  226.            try
  227.            {
  228.                System.Timers.Timer miTimer = new System.Timers.Timer
  229.                {
  230.                    Enabled = true
  231.                };
  232.                miTimer.Elapsed += new ElapsedEventHandler(DisparadorEventosTimer);
  233.                miTimer.Interval = 5000; // Escaneo cada 5 segundos.
  234.                miTimer.Start(); // Activa el temporizador.
  235.  
  236.  
  237.                Console.ReadKey(); // Pulse cualquier tecla para salir.
  238.            }
  239.  
  240.            // Cualquier error mostrado en mensaje y de color rojo.
  241.            catch (Exception ex)
  242.            {
  243.                Console.ForegroundColor = ConsoleColor.Red;
  244.                Console.WriteLine();
  245.                Console.WriteLine(ex);
  246.                Console.ReadKey();
  247.            }
  248.  
  249.  
  250.        }
  251.  
  252.        // Detecta cualquier dato entrante.
  253.        private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
  254.        {
  255.            SerialPort sp = (SerialPort)sender;
  256.            string entradaDatos = sp.ReadExisting(); // Almacena los datos recibidos en la variable tipo string.
  257.            Console.WriteLine("Dato recibido desde Arduino: " + entradaDatos); // Muestra en pantalla los datos recibidos.
  258.        }
  259.    }
  260.  
  261.    public class ConnectPop3
  262.    {
  263.        public string email = "metaconta@gmail.com";
  264.        public string contraseña = "g0923490xgh0945g450Xj4025g"; // Ficticio.
  265.        public int puerto = 995;
  266.        public bool usarSLL = true;
  267.        public string Hostame = "pop.gmail.com";
  268.  
  269.        public List<OpenPop.Mime.Message> GetMessages()
  270.        {
  271.            using (Pop3Client oClient = new Pop3Client())
  272.            {
  273.                oClient.Connect(Hostame, puerto, usarSLL);
  274.                oClient.Authenticate(email, contraseña);
  275.  
  276.                int messageCount = oClient.GetMessageCount();
  277.                List<OpenPop.Mime.Message> lstMessages = new List<OpenPop.Mime.Message>(messageCount);
  278.  
  279.                for (int i = messageCount; i > 0; i--)
  280.                {
  281.                    lstMessages.Add(oClient.GetMessage(i));
  282.                }
  283.  
  284.                return lstMessages;
  285.            }
  286.        }
  287.    }
  288. }

Saludos.

Edito:
Edito:

En resumen para que se entienda mejor.

El programa lo que hace leer e-mail recibidos y filtran los que he elegido para ser leídos, detecta que su contenido tiene formato o es solo texto en plano.

En el asunto de e-mail, pongo los comandos, por ejemplo, uso tres, Luz_ON, Luz_OFF y Salir. Si le llega, salir, cierra el puerto serie y el propio programa de la consola C#.

Si le llega el comando Luz_ON, lo envía al puerto serie. Acto seguido, espera una respuesta desde el puerto serie y lo muestra en pantalla de C#.

Eso es todo y es más complicado de hacer el programa de lo que parece.

Gracias por leer hasta aquí. ;)


« Última modificación: 9 Febrero 2023, 21:44 pm por Meta » En línea

Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
Re: Recibir email y enviar al puerto serie
« Respuesta #1 en: 10 Febrero 2023, 18:14 pm »

Ya me funciona.  ;-) ;-) ;-) ;-)


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Recibir datos del puerto serie en bytes.
.NET (C#, VB.NET, ASP)
Meta 2 7,176 Último mensaje 29 Octubre 2008, 23:24 pm
por Meta
Enviar y recibir .txt y .jpg por puerto serie con C#
.NET (C#, VB.NET, ASP)
Meta 4 11,589 Último mensaje 4 Diciembre 2009, 15:05 pm
por MANULOMM
Recibir datos desde el puerto serie
Programación Visual Basic
Meta 2 2,747 Último mensaje 3 Junio 2015, 21:07 pm
por Meta
recibir los datos de un puerto serie y actulizarlo en una label
Programación Visual Basic
cael1011 3 2,855 Último mensaje 7 Agosto 2015, 13:26 pm
por 79137913
Recibir datos desde el puerto serie.
Programación C/C++
Meta 3 4,102 Último mensaje 12 Julio 2017, 20:17 pm
por ivancea96
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines