Skip to content

Instantly share code, notes, and snippets.

@edson-github
Forked from humrochagf/emailchecker.py
Created November 29, 2022 16:54
Show Gist options
  • Save edson-github/5d8ef84f3d08f38989e3dc525c0e5f5c to your computer and use it in GitHub Desktop.
Save edson-github/5d8ef84f3d08f38989e3dc525c0e5f5c to your computer and use it in GitHub Desktop.

Revisions

  1. @humrochagf humrochagf created this gist Jul 4, 2018.
    111 changes: 111 additions & 0 deletions emailchecker.py
    Original file line number Diff line number Diff line change
    @@ -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()