Enviando e recebendo emails com Python
Publicado em
Um dia na terça do Python no Calango Hacker Clube surgiu uma dúvida de como ler emails do Gmail para poder categorizar as mensagens e automatizar o processo de leitura dos emails usando Python. Esta dúvida motivou esta postagem que tem o objetivo de ajudar a todos que tiverem dúvidas de como começar a interagir com sistemas de troca de emails utilizando Python.
Esta postagem tem como alvo o público iniciante mas também pode ser útil para quem já possuí experiência na linguagem mas nunca tinha trabalhado diretamente com envio e recebimento de emails. A versão do Python utilizada para publicar esta postagem foi a 3.6.x.
Os Protocolos de email
Sistemas de email são muito robustos pois são construídos em cima de protocolos muito bem estabelecidos e usados por todas as plataformas de email da internet. Estes protocolos são definidos e publicados através de documentos chamados de RFC que é uma sigla para Request for Comments que lembram um pouco as PEPs do Python só que para os protocolos que definem a base do funcionamento das comunicações entre sistemas como a internet.
Para enviar emails utilizamos o protocolo SMTP (RFCs 821 e 5321) e para receber emails temos os protocolos IMAP (RFC 3501) e POP (RFCs 918 e 1081).
Enviando emails
Simple Mail Transfer Protocol ou SMTP é um protocolo da camada de aplicação usado para o envio de emails. Ele opera sobre TCP/IP e sua comunicação é realizada por padrão pela porta 25 ou 587 para conexões não cifradas e 465 para conexões cifradas com TLS/SSL.
Python já vem com baterias, por isso não precisaremos instalar nenhum pacote para fazer o envio de mensagens SMTP, para isso utilizaremos uma biblioteca interna do python chamada smtplib
:
|
|
Para enviar emails como localhost você precisa ter um servidor de emails instalado na máquina em que o código está rodando
O código acima é a versão mais crua de um envido de email. Nele nós construímos a mensagem “na mão” com uma string, porém o Python possuí uma biblioteca para facilitar o nosso trabalho.
Uma outra questão do código acima é que estamos enviando o email de um servidor local e isso pode vir a ser um problema pois a rede de envios de emails funciona através de uma rede de confiança. Se seu servidor local não segue as práticas recomendadas de envio de email ou seu ip não é muito conhecido nesta rede de confiança seus emails podem cair em caixa de spam e em alguns casos simplesmente ser recusado pelo destinatário.
Para resolver estas questões e garantir que nossa mensagem chegue corretamente vamos mudar um pouco o código e usar o gmail para facilitar a garantia da entrega da nossa mensagem:
|
|
Caso esteja enfrentando problemas para se conectar ao google será preciso liberar o “Acesso a app menos seguro”.
O google bloqueia acessos de aplicações que ele julgar como não seguindo os padrões de segurança, o problema é que não fica muito claro quais os padrões requisitados além de não ser uma tarefa muito trivial para quem está realizando seus primeiros testes de comunicação com um servidor de emails.
Entretanto, para que isso não seja um empecilho em seus primeiros passos no mundo do envio e recebimento de emails, você pode liberar o acesso de apps mesmos seguros através das configurações de segurança da sua conta em https://myaccount.google.com/u/0/security?hl=pt:
Com isso passaremos a utilizar o google como nosso intermediário (gateway) para enviar as mensagens de emails. Mas tenha em mente que mesmo com o google como seu gateway existe uma política de envio de mensagens de email, cuidado com os SPAMS.
Recebendo emails
O protocolo IMAP Internet Message Access Protocol é usado para receber emails e assim como o SMTP, opera na camada de aplicação sobre TCP/IP, porém utiliza as portas 143 para conexão não cifrada e 993 para conexão cifrada com SSL.
Além do IMAP, podemos também receber emails através do protocolo POP Post Office Protocol, mas atualmente o protocolo IMAP é o mais indicado para esta tarefa pois com ele é possível manter todos os seus clientes de email sincronizados e organizados, além da possibilidade de acessar mais do que somente a caixa de entradas do seu email.
O processo de recebimento é mais complexo que o envio, pois dentro dele está incluso a busca pela mensagem que você deseja ler e sua decodificação. No código a seguir tentarei comentar todas estas etapas:
|
|
Neste código extraímos somente o conteúdo em texto puro do email, porém há muito mais coisas que podem ser tratadas como conteúdo em html e extração de anexos mas estes casos ficaram para uma próxima postagem.
BONUS: Limpando Caixas de Email Lotadas
Recentemente minha caixa de emails lotou e eu precisei dar uma faxina para liberar espaço, mas o volume era tão grande que a interface do gmail não estava dando conta do recado.
Para isso é possível utilizar o Python para nos ajudar com esta questão:
|
|
Caso o volume de emails seja muito grande é possível também fazer um loop agrupando a remoção em blocos de remoção menores.
Para buscas mais elaboradas com o comando search
você pode acessar a RFC 3501 que define o protocolo IMAP e contém a descrição detalhada de todos os parâmetros de busca possíveis bem como mais detalhes para todos os outros comandos de manipulação de emails.
ATENÇÃO: Teste bastante as buscas antes de realizar a remoção efetivamente pois esta remoção não tem volta.

Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional .