Páginas

28 de fevereiro de 2019

Como Ler Email Programaticamente em C#

Para fazer a leitura programaticamente de emails, existe uma biblioteca chamada OpenPop.NET, que é uma implementação open source de um cliente POP3 e um analisador MIME escrito em C#. Com esta biblioteca é possível ler as informações de email, tais como, origem, destino, assunto, mensagem, etc.

Para demonstrar a utilização desta biblioteca foi criado o projeto LerEmail no Visual Studio, que faz a leitura das informações como origem, destino assunto e mensagem dos 10 emails mais recentes recebidos na caixa de entrada de um servidor web.

Mas antes de utilizar a biblioteca é necessário incluir no projeto do Visual Studio. A biblioteca OpenPop.NET pode ser incluída utilizando-se a ferramenta de gerenciamento de pacotes NuGet do Visual Studio. Esta ferramenta pode ser acessada clicando com o botão direito sobre  a pasta References do projeto e selecionando a opção Manage NuGet Packages.
vs1
Na tela Manage NuGet Packages fazer uma busca pela biblioteca OpenPop.NET e clicar no botão Install, quando a biblioteca for localizada.
vs2
Após a inclusão da biblioteca no projeto do Visual Studio, pode-se  utilizar a classe Pop3Client() que possui os métodos GetMessageHeaders(int) e GetMessage(int) para obter as informações do cabeçalho da mensagem e do corpo da mensagem, respectivamente. Para obter estas informações é necessário passar para estes métodos o parâmetro número do email que deve ser lido.

A classe Pop3Client() faz a leitura dos emails utilizando um contador que  ordena em ordem decrescente o email, sendo o de maior número o email mais recente e o de menor número o email mais antigo. Para obter o número total de emails utilizar o método GetMessageCount().

Portanto para o caso de ler os emails mais recentes é necessário obter o número total de emails através do método GetMessageCount() e a partir dele ir decrementando o número até obter os emails desejados. Para o caso de ler os emails mais antigos iniciando-se, por exemplo, do primeiro email utilizar o número 1 até o número de emails desejados.

Segue o código do método BuscaEmail(string, int, string, string) que exemplifica como ler os 10 emails mais recentes da caixa de entrada.
        static void BuscaEmail(string nome_servidor_pop, int porta, string email, string senha)
        {
            // A instrução using faz a desconexão do servidor de email
            // e libera corretamente o objeto
            using (Pop3Client cliente_pop = new Pop3Client())
            {
                // Faz a conexão com o servidor
                cliente_pop.Connect(nome_servidor_pop, porta, false);

                // Faz a autenticação no servidor
                cliente_pop.Authenticate(email, senha, 
                    AuthenticationMethod.UsernameAndPassword);

                // Obtêm o número total de emails da caixa de entrada
                int numero_emails = cliente_pop.GetMessageCount();
                
                // Faz a leitura dos 10 emails mais recentes da caixa de entrada,
                // iniciando a partir do último email recebido.
                for (int i = 0; i < 10; i++)
                {
                    // Cabeçalho da mensagem
                    MessageHeader headers = cliente_pop.GetMessageHeaders(numero_emails);

                    // Email De:
                    RfcMailAddress emailDe = headers.From;

                    // Email Para:
                    // Faz a leitura de todos os emails Para, mas exibe somente o primeiro.
                    List<RfcMailAddress> emailParaList = headers.To;
                    string emailPara = string.Empty;
                    if (emailParaList != null && emailParaList.Count() > 0)
                    {
                        emailPara = emailParaList.First().Address;
                    }

                    // Assunto
                    string assunto = headers.Subject;

                    // Data de envio
                    DateTime data_envio = headers.DateSent;

                    // Verifica se o endereço de email De é válido
                    if (emailDe.HasValidMailAddress)
                    {
                        // Corpo do email
                        Message mensagem = cliente_pop.GetMessage(numero_emails);
                        string corpo_email = mensagem.MessagePart.GetBodyAsText();

                        // Imprime as informações do email
                        Console.WriteLine("De: " + emailDe);
                        Console.WriteLine("Para: " + emailPara);
                        Console.WriteLine("Assunto: " + assunto);
                        Console.WriteLine("Data de Envio: " + data_envio);
                        Console.WriteLine(corpo_email);
                        Console.WriteLine("".PadLeft(30, '-'));

                        // Decrementa o número de emails
                        numero_emails--;
                    }
                }
            }
        }

O método BuscaEmail(string, int, string, string) faz a conexão e autenticação com o servidor, obtêm o número total de emails e a partir daí faz a leitura dos 10 emails mais recentes da caixa de entrada e exibe em uma tela console as informações dos emails.