Realizar una conexión al correo para ver los mails con C# .Net. #gmail #pop3 #OpenPop.Net

En esta entrada tratare el tema de realizar una conexión por el protocolo Pop3 para poder leer nuestro correo electrónico, en este caso utilizare una cuenta de Gmail y obtendré los correos de la bandeja de entrada de la misma.

Para poder conectarnos haremos uso de una librería llamada OpenPop.Net que ya realiza la conexión de una manera rápida. La podemos descargar desde su página, o directamente de Nuget en visual studio buscándola por su nombre.

Es importante que realicemos en nuestra cuenta de Gmail los siguientes cambios, ya que Gmail cuenta con restricciones a clientes externos para leer los mails.

Primero(con sesión creada en gmail para hacer estos cambios claro) debemos activar la opción de permitir conexiones de aplicaciones externas en la siguiente liga:

https://www.google.com/settings/security/lesssecureapps

Seleccionamos Activar y Guardar.

La segunda configuración es opcional y es para que Gmail nos permita descargar varias veces los mensajes aunque sea ya leído o ya descargado, basta con que vallamos a la configuración de Gmail y seleccionemos la siguiente opción y demos guardar.

gmail configuracion

Una vez tengamos la librería y la configuración en Gmail podemos hacer uso de la siguiente clase que he escrito y comentado pasó por paso:


using OpenPop.Mime;
using OpenPop.Pop3;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Remoting.Messaging;
using System.Text;

namespace Sincronizador_SMTP.Business.Connect
{
 /// <summary>
    /// clase que se conecta por smtp
    /// </summary>
    class ConnectPop3
    {
        //usuario/mail de gmail
        private string username = "[email protected]";
        //password
        private string password = "tupassword";
        //el puerto para pop de gmail es el 995
        private int port = 995;
        //el host de pop de gmail es pop.gmail.com
        private string hostname = "pop.gmail.com";
        //esta opción debe ir en true
        private bool useSsl = true;

        public List<Message> getMensajes()
        {
            try
            {

                // El cliente se desconecta al terminar el using
                using (Pop3Client client = new Pop3Client())
                {
                    // conectamos al servidor
                    client.Connect(hostname, port, useSsl);

                    // Autentificación
                    client.Authenticate(username, password);

                    // Obtenemos los Uids mensajes
                    List<string> uids = client.GetMessageUids();

                    // creamos instancia de mensajes
                    List<Message> lstMessages = new List<Message>();

                    // Recorremos para comparar
                    for (int i = 0; i < uids.Count; i++)
                    {
                           //obtenemos el uid actual, es él id del mensaje
                           string currentUidOnServer = uids[i];

                            //por medio del uid obtenemos el mensaje con el siguiente metodo
                            Message oMessage = client.GetMessage(i + 1);

                            //agregamos el mensaje a la lista que regresa el metodo
                            lstMessages.Add(oMessage);

                    }

                    // regresamos la lista
                    return lstMessages;
                }
            }

            catch(Exception ex){
               //si ocurre una excepción regresamos null, es importante que cachen las excepciones, yo
               //lo hice general por modo de ejemplo
                return null;
            }
        }
}

Y de esta manera utilizamos la clase y recorremos los mensajes, y a su vez mostramos el asunto para probar que si corresponde a lo que tenemos en nuestra cuenta de Gmail.


//creamos el objeto
ConnectPop3 oCP3 = new ConnectPop3();

//invocamos el metodo para obtener mensajes
List<OpenPop.Mime.Message> lstMensajes = oCP3.getMensajes();

//recorremos y mostramos el asunto
foreach(OpenPop.Mime.Message oMensaje in lstMensajes){
                Console.WriteLine(oMensaje.Headers.Subject);
}

Nota: Pop3 al igual que IMAP es un protocolo para leer mails, si deseamos enviar mails debemos conectarnos con el protocolo SMTP.