# Python 3.8.0
import smtplib
import time
import imaplib
import email
import traceback

import base64
import os
# -------------------------------------------------
#
# Utility to read email from Gmail Using Python
#
# ------------------------------------------------
# But : convertir des pièces jointes PDF
#       contenant du texte, difficilement lisibles
#       sur smartphone
#       --> utiliser pdftotext pour extraire silmplement le texte
#
# Source 1 : https://codehandbook.org/how-to-read-email-from-gmail-using-python/
# Source 2 : https://medium.com/@sdoshi579/to-read-emails-and-download-attachments-in-python-6d7d6b60269

ORG_EMAIL "@gmail.com"
FROM_EMAIL "PARTIE_MAIL_AVANT_@gmail.com" ORG_EMAIL
FROM_PWD "MOT_DE_PASSE_D_APPLICATION"
SMTP_SERVER "imap.gmail.com"
SMTP_PORT 993

try:
    os.mkdir('pieces_jointes')
except OSError as error:
    print(error)


def read_email_from_gmail():
    try:
        mail imaplib.IMAP4_SSL(SMTP_SERVER)
        mail.login(FROM_EMAIL,FROM_PWD)
        mail.select('inbox')

        data mail.search(None'ALL')
        mail_ids data[1]
        id_list mail_ids[0].split()
        first_email_id int(id_list[0])
        latest_email_id int(id_list[-1])

        for in range(latest_email_id,first_email_id, -1):
            data mail.fetch(str(i), '(RFC822)' )
            for response_part in data:
                arr response_part[0]
                if isinstance(arrtuple):
                    msg email.message_from_string(str(arr[1],'utf-8'))
                    email_subject msg['subject']
                    email_from msg['from']
                    print('From : ' email_from '\n')
                    print('Subject : ' email_subject '\n')
                    # downloading attachments
                    for part in msg.walk():
                        # this part comes from the snipped I don't understand yet...
                        if part.get_content_maintype() == 'multipart':
                            continue
                        if part.get('Content-Disposition'is None:
                            continue
                        fileName part.get_filename()
                        if bool(fileName):
                            filePath os.path.join('pieces_jointes/'fileName)
                            if not os.path.isfile(filePath) :
                                fp open(filePath'wb')
                                fp.write(part.get_payload(decode=True))
                                fp.close()
                                subject str(msg).split("Subject: "1)[1].split("\nTo:"1)[0]
                                # print('Downloaded "{file}" from email titled "{subject}" with UID {uid}.'.format(file=fileName, subject=subject, uid=latest_email_uid.decode('utf-8')))

    except Exception as e:
        traceback.print_exc()
        print(str(e))

read_email_from_gmail()