@@ -0,0 +1,111 @@
# Este é o código de como ler emails do gmail
# discutido no calango, ele foi escrito para rodar em
# python 3
import email
import imaplib
EMAIL = '[email protected] '
PASSWORD = '@Calango123'
SERVER = 'imap.gmail.com'
def read_email_from_gmail ():
# Abre uma conexão com o servidor do gmail
# realiza o login e navega para a inbox
mail = imaplib .IMAP4_SSL (SERVER )
mail .login (EMAIL , PASSWORD )
mail .select ('inbox' )
# Realiza uma busca na inbox com o critério de busca ALL
# para pegar todos os emails da imbox
# a busca retorna o status da operação e uma lista com
# os ids dos emails
status , data = mail .search (None , 'ALL' )
# data é uma lista com ids em blocos de bytes separados
# por espaço neste formato: [b'1 2 3', b'4 5 6']
# então para separar os ids nós primeiramente criamos
# uma lista vazia
mail_ids = []
# e em seguida iteramos pelo data separando os blocos
# de bytes e concatenando a lista resultante com nossa
# lista inicial
for block in data :
# a função split chamada sem nenhum parâmetro
# transforma texto ou bytes em listas usando como
# ponto de divisão o espaço em branco:
# b'1 2 3'.split() => [b'1', b'2', b'3']
mail_ids += block .split ()
# agora para cada id de email baixaremos ele do gmail
# e extrairemos o conteúdo
for i in mail_ids :
# a função fetch baixa o email do gmail passando id
# e o padrão RFC que você deseja que a mensagem venha
# formatada
status , data = mail .fetch (i , '(RFC822)' )
# data por algum motivo que eu desconheç vem naquele
# formato que um item é uma tupla e o outro é só b')'
# por isso vamos iterar pelo data até encontrar a tupla
for response_part in data :
# se for a tupla a gente extrai o conteúdo
if isinstance (response_part , tuple ):
# usando a função e extrair os dados do email
# a gente pasa o segundo item da tupla que tem o
# conteúdo porque o primeiro é só a informação
# do formato do conteúdo
message = email .message_from_bytes (response_part [1 ])
# daí com o resultado conseguimos tirar as
# informações de quem enviou o email e o assunto
mail_from = message ['from' ]
mail_subject = message ['subject' ]
# agora para o conteúdo precisa de um pouco mais de
# trabalho porque ele pode vir em texto puro
# ou multipart, se for texto puro é só ir para o
# else e extrair o conteúdo, senao tem que extrair
# somente o que precisa
if message .is_multipart ():
mail_content = ''
# no caso do multipart vem junto com o email
# anexos e outras versões do mesmo email em
# diferentes formatos tipo texto imagem e html
# para isso vamos andar pelo payload do email
for part in message .get_payload ():
# se o conteúdo for texto text/plain que é o
# texto puro nós extraímos, senão não faz nada.
# Nesta parte teria que colocar mais lógica porque
# por exemplo naquele email de boas vindas do gmail
# não tem versão texto puro ele retorna só um hash
# em texto, neste caso teriamos que criar um if
# para se o content_type fosse text/html e fazer a
# extração dos dados de lá que fica de ponto para
# estudo :)
if part .get_content_type () == 'text/plain' :
mail_content += part .get_payload ()
else :
mail_content = message .get_payload ()
# pro fim a gente printa os dados extraídos na tela
print ('From: {}' .format (mail_from ))
print ('Subject: {}' .format (mail_subject ))
print ('Content: {}' .format (mail_content ))
# esta parte aqui é um truque para quando a gente roda o
# arquivo direto da linha de comando ele rodar a função
# que criamos, desta forma ele só roda a função quando ele
# for o arquivo principal:
#
# python3 emailchecker.py
#
# Se ele não for o principal como quando chamamos usando
#
# import emailchecker
#
# ele não roda a função para que possamos usar este arquivo como
# um submódulo de outro arquivo
if __name__ == '__main__' :
read_email_from_gmail ()